投稿

2016の投稿を表示しています

Xcode 8.2 はシミュレータでスクリーンショットを撮ると落ちる on El Capitan

El Capitan 上の Xcode 8.2 は、シミュレータに付いているスクリーンショット撮影機能(File -> Save Screen Shot)を使うと落ちます。厳密に言うと1回目はOKで2回目に落ちる。 対策は シミュレータで、Edit -> Copy Screen Previewで、File -> New from Clipboard 手間もそんなに変わりません。 stackoverflowの記事(英語)

libswiftCore.dylibをロード出来ない問題

証明書はXcodeで自動で作成するようになったので、キーチェーンアクセスからappleの名前のものを手当たり次第削除して、Xcodeで一から作成したところ、アプリがシミュレータでは動作出来るのに、実機で実行できない問題にあたりました。Xcode 8.1です。 dyld: Library not loaded: @rpath/libswiftCore.dylib というエラーが出ます。 ググったらキャッシュをクリーンさせる系の解決策もありましたが状況は変わらず。 最終的に http://developer.apple.com/certificationauthority/AppleWWDRCA.cer をダウンロードすることで解決しました。(プロジェクトのクリーンもやったかも) https://forums.developer.apple.com/thread/21292 に書かれています。 このAppleWWDRCA.cerが何をするものかはわかりません。

No Common Blocks - Xcode 8から起こりがちなリンクエラー

Build SettingにあるNo Common BlocksというものがXcode 8からデフォルトでOnの模様。古いプロジェクトを初めてXcode 8で開くときに出てくる、コンパイラ設定変更の警告に従うとOnにされる。 これがOnだとObjective-Cのプロジェクトで、例えば あるヘッダーでグローバル変数を定義している(例 : int a; ) そのヘッダーが2箇所以上から#importされる の条件でリンクエラーを起こします。 externで回避しました。 ヘッダー側はextern int a; 実装側でint a; externの説明は他を参照して下さい。 検索用 Xcode 8 No Common Blocks Apple Mach-O Linker Error Linker command failed with exit code 1 (use -v to see invocation) Message from debugger: Terminated due to signal 15

Swift 3.0でStringはどうなったか

前回Swift2.0のStringの仕様を調べたが、編集系(append, insert, remove, replace)のメソッドの仕様は整理しきれていない、というくやしい終わり方をした。 Swift 2.0でStringはどうなったか - 特殊文字などの扱い 今回はまず、この編集系メソッドから見ていく。 編集系メソッドの引数に与えるものは主にCharacterとStringであるが 、そのほかにCharacterを要素にもつシーケンスというものがある。これは、名前がSとして <S : Sequence where S.Iterator.Element == Character> という性質を持つ。ここではこれを「Characterシーケンス」ということにする。 append(連結)系 Swift2.0ではメソッド名がバラバラだったものが、めでたくappendに統一された。 CharacterやStringの場合は引数ラベルなしで与える。 Characterシーケンスの場合はラベルにcontentOfが付けられる。 mutating func append(_ c: Character) mutating func append(_ other: String) mutating func append<S : Sequence where S.Iterator.Element == Character>(contentsOf newElements: S) このほかに土台のStringに変更を加えないで、与えられたものを追加したStringを返すメソッドがある。 func appending(_ aString: String) -> String これは土台のStringが変更されないので、mutatingが付けられていない。他の編集系メソッドにも語尾がingでこの性質のメソッドがある。 insert(挿入)系 これも名前がinsertに統一された。 appendと同じようにCharacterシーケンスの場合はラベルにcontentOfが付けられる。 Stringを受けるものはない? mutating func insert(_ newElement: Character, at i: Stri

Swift2.2からSwift3.0への変換を行ってみて

イメージ
Xcode8のGMが出たので、Swiftを2.2から3.0へ変換しました。自動でコンバートするXcodeの機能を使いました。 変換箇所があらかじめ表示されるので、一通り見て気が付いたことを書いていこうと思います。 enumの要素の頭文字が小文字に統一 どっちが正解なのかなぁと思いながらプログラムを作成していた部分なのではっきり決めてくれて良かったです。 配列の初期化メソッド 配列の初期化によく使われる init(count: repeatedValue: )が init(repeating: count: ) になりました。順番が変わって、さらに現在分詞になりました。 NS抜け NSBundle が Bundle へ変更 NSIndexPath が IndexPath へ変更 NSURL が URL へ変更 Appleに従うのみ。 タイプメソッド扱いしていたものがタイププロパティ扱いに NSBundle.mainBundle() が Bundle.main へ変更 UIScreen.mainScreen() が UIScreen.main へ変更 UIDevice.currentDevice() が UIDevice.current へ変更 UIColor.whiteColor() が UIColor.white へ変更 //例 open class var white: UIColor { get } 従うのみ。 CoreGraphics衣替え CGRectMakeなどのC言語ベースのCG***関数がSwift3.0では廃止になっています。 (旧)CGRectMake(***) が (新)CGRect(***) へ変更、CGRect(***)の方はSwiftの構造体のinit命令呼び出しです。 (旧)CGPointMake(***) が (新)CGPoint(***) へ変更、CGPoint(***)の方はSwiftの構造体のinit命令呼び出しです。 (旧)CGRectContainsPoint(CGRect rect, CGPoint point) が (新)CGRectインスタンスに対するcontains(_:)メソッドへ変更 (旧)CGContextFillPath(CGContext

iOS10対策

イメージ
Privacy - Media Library Usage Description この問題はシミュレータ(Xcode8.0)で発生したが、実機では発生しませんでした。 iPodライブラリの曲をアプリ内で使うとき、ユーザーに許可を取るようになりました。 この時の文面をinfo.plistに設定する必要があります。 Privacy - Media Library Usage Description(rawキーではNSAppleMusicUsageDescription)に何か文を追加します。 これを設定しておくと、アプリがライブラリにアクセスしようとしたところで、Don't allow / OKダイアログをOSが勝手に出してくれて、その中に先ほどの自分で追加した文が表示されます。 これを設定しないと、アプリが落ちます。 出す文章を各言語毎に変えたい時は、InfoPlist.stringsのローカライズをするとよいでしょう。 xibファイルのBuilds for この問題はシミュレータ(Xcode8.0)で発生したが、実機では発生しませんでした。 [UIDeviceRGBColor length]で実行時エラーが発生しました。これは自分で書いたプログラムではないので原因がわかりにくかったのですが、xibファイルのBuilds forが未設定でした。Xcode3の時に作成したプロジェクトで発生しました。xibファイルのBuilds forをDeployment Target (8.0)にしました。

Swift2 標準ガイドブック

説明は全体的にざっくりアバウトな感じなので荻原本などを併用すること。 イニシャライザの項目に間違いが多いので修正があるといいです。

詳解Swift改訂版買いました

詳解Swift改訂版を買いました。 Objective-C版も持っています。Objective-C版に比べて推敲が甘いかなと感じる部分が特に最後の方で多かったです。版を重ねて修正が加わるといいです。 以下、自分用のメモ。 構造体 イニシャライザ内でメソッドを呼ぶのは初期値設定が全部済んでから。 構造体の内部で別の構造体を定義出来る。 構造体の内部で、typeエイリアスを使って、別名を与えることが出来る。(メリット?) タイププロパティの値を変更するインスタンスメソッドにはmutatingは不要。 タイププロパティの初期化のための式は値が必要とされた時に初めて評価される。 didSet WillSetはinit()内での設定では呼ばれ無い。didSetで値を設定しても再帰的に呼ばれることはない。 オプショナル オプショナル==nilはnilかどうか オプショナル==非オプショナルは中身を比べることが出来る if letのほかにif varもある readLineは標準入力 ??の右はオプショナルでもいい。??は連鎖できる。 配列 配列を反対にするreverse()というメソッドがある。 String Characterの配列からStringインスタンスを作るinitメソッドがある UnicodeScalarにはvalueプロパティがあって値を取り出せる 辞書 新規はdict[a] = aaa 削除はdict[b] = nil updateは更新、ただしもとからない場合は作成しない。 Tuple let aTuple = (1, 2, 3) let (a, b, c) = aTuple //これが出来る let (aa, _, _) = aTuple //使わないときは_が使える 値が一つだけのTupleはその値だけと変わらない 要素が一つもないことを()で表現。Voidは()の別名 違うキーワードのTuple間の代入は無理。型が同じでも。一度キーワードなしにキャストすればOK キーワード付きのタプルの代入では順番が違っていてもキーワード毎に要素が代入される。キーワードがない部分は順番通りに代入される。 タプルにTypealiasでなまえをつけることができる。 Switch オプショナル付きのタプルを扱える switch a

xibでUIView内レイアウト設計してアプリに取り込むシンプルな方法 Swift編

イメージ
1.UIViewのサブクラスのソースファイルを作成。 2.UIViewをベースにして新規xib作成(UIViewControllerではない)。 3.xibで、UIViewのクラスを1で作ったクラスに設定する。 4.作成したUIViewを取り込みたいUIViewControllerなどでインスタンスを作成する let settingView: SettingView = NSBundle.mainBundle().loadNibNamed("SettingView", owner: nil, options: [:]).first as! SettingView 5.xib内でレイアウトを行う。