投稿

詳解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内でレイアウトを行う。

Swift Compiler Architecture (Swiftコンパイラの構造)

Swiftがオープンソースになって公開された資料の中でSwiftのコンパイラについて書かれている部分を抜粋し、日本語に訳す。意味がわからないところは(?)を付けた。 Compiler and Standard Library The main Swift repository にはSwiftのコンパイラとスタンダードライブラリのソースコードがあります。 Compiler Architecture Swiftで書かれたソースコードからLLVM IRに変換される工程です。上から下に流れていきます。 Parsing ( lib/Parse ) : parserはソースコードをAbstract Syntax Tree (AST)に変換します。ここでは意味の情報も、型の情報も扱いません。ソースに文法の問題があるときはメッセージを出します。 Semantic analysis ( lib/Sema ) : parseされたASTを整形された型チェック済みのASTに変換します。意味の問題があるときはメッセージを出します。ここには型推論が含まれます。 Clang importer ( lib/ClangImporter ) : Clang modules をインポートします。そしてCやObjective-CのAPIと対応するSwiftのAPIをmapします(?) SIL generation ( lib/SILGen ) : Swift Intermediate Language (SIL)とはSwift用の中間言語で、さらなる分析と最適化に適しています。SIL generationは型チェック済みのASTを"生の"SILに"レベル下げ"します。 SIL guaranteed transformations ( lib/SILOptimizer/Mandatory : 変数の初期化などのデータの流れを診断します。この工程を終えると“canonical(正式な)” SILとなります。 SIL Optimizations ( lib/SILOptimizer/Analysis と lib/SILOptimizer/ARC と lib/SILOptimizer/LoopTransforms と lib/SILOp...

Objective-Cで保存したアーカイブデータをSwiftで読み込む

アプリをObjective-CからSwiftに書き換える際、少し悩むことに、Objective-Cで保存したアーカイブデータ(ユーザーのデバイスに保存されている)をSwiftで読み込むにはどうすればいいのかということがあります。 ここでは、NSKeyedUnarchiverやNSKeyedArchiverクラスを用いて利用するアーカイブデータがデバイスに保存されている場合に限定して、アプリをSwiftに書き換える時の手順などをまとめます。 ファイルの場所の指定 データの保存と読み込みではファイルの場所を指定します。ファイルの場所の指定はObjective-CとSwiftでほとんど同じ感覚でいけます。 var fileName = "" let paths: [String] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) if 0 < paths.count { fileName = paths[0] fileName.appendContentsOf("/targetObject.dat") //print(fileName) } if 0 < paths.countは一応入れといた。 ちなみにstringByAppendingPathComponentというNSStringクラスのメソッドは使えなくなったようです。追加するものの前に自動的に/を加えるメソッドです。URLクラスに同じ機能のメソッドがありそっちを使えと表示が出ます。使えなくなったのが意図的だとすればStringとして扱うかURLとして扱うか中途半端ということでしょうか。 アプリにアーカイブ機能を付けるためにソースを書く部分 主に3つあります。 1 : データを保存するところ 2 : データを読み込むところ 3 : データ自体の定義 データの保存/読み込み データの保存/読み込みの仕方は A : オブジェクトをファイルに直接アーカイブする B : NSDataを介してオブジェクトをファイルにアーカイブする と2つあります。保存時と読み込み時でやり方が「対」になっていると余計...

Swiftのオプショナルのオプショナルて何??

イメージ
オプショナルのオプショナルはあります。 正式な呼び方がなんなのかはわからないけど確かにあります。ちょっと長くなるけど調べたときのいきさつ形式で書きます。 エラーハンドリングについて調べていたときに以下のコンパイルエラーに遭遇しました。 Value of optional type 'Int?' not unwrapped; did you mean to use 'try!' or chain with '?'? オプショナルの値のInt?はアンラップされません、やろうとしていることはtry!か、?を使った連鎖で出来ませんか? このエラーは以下のようなプログラムの最後にある try? で出ました。実行はPlaygroundです。 enum MyError: ErrorType { case myError } func someThrowingFunction(a: Int) throws -> Int { if 1 < a { throw MyError.myError } return a } func someFunction() { let a: Int = try? someThrowingFunction(5) //ここでエラー発生 } このエラーメッセージは、「try? というのは戻り値を格納する値の型をオプショナル型にする必要があるのでして下さい」という趣旨のメッセージです。ここでは最後のaの宣言を Int? にすればよいです(または型を書かずにコンパイラに推論させればよい)。 まあこれでこの件は解決なんですが、ただ、メッセージの最後の chain with '?' (?を使った連鎖)が気になりました。chainは連ねるという意味ですから??のように重ねること?なぜこの状況でchainが出てくるのか?といろいろ考えているうちに、もしかして ?? というものがあるのでは?と思い、以下のプログラムを試してみました。メソッドの戻り値を Int? にしてみました。 //戻りをInt?に変更 func someThrowingFunctionOPT(a: Int) throws -> Int? { if 1 < a...

従来のソフトのままでiPad Proの画面に対応する方法

イメージ
以下の記事はちょっとまだ公式のソースを確認できていないので自己責任でお願いします。 iPhoneが3.5インチサイズから4.0インチサイズに移行したときは4.0用の起動画面を用意することで4.0に対応していることを示すやり方でした。用意しなければ真ん中に3.5インチサイズの画面が出て、黒い帯で上下の空いた領域を埋める仕様でした。iPhone6や6sのときも対応/非対応の区別は起動画面を用意するかしないかでした。 今回iPad Proが新規解像度2732 x 2048で出てきましたが、対応/非対応のポイントはやはり起動画面のようです。 ただ今回はファイルを用意するのではなく、Launch Screen File(storyboard風のやつ)が設定してあることが「iPad Proに対応している(2732 x 2048も想定して描画処理を書いてある)」ことを示すようです。図のSourceのほうではなくてFileのほうです。iPad Pro対応しないとき(iPadのレギュラーサイズの画面を引き伸ばしたいとき)は「なにも設定しない」にしてください。こうすることで内部でiPadレギュラーサイズとして描画したものをiPad Proの画面の大きさに引き延ばすような処理になります。 ちょっとまだ公式のソースを確認できていないので自己責任でお願いします。実機はまだ発売されていないので確認したのはシミュレータのみです。Xcodeは7.1です。 未来ぽい感じがして好きだったんですが一旦OFFにしておきますかね。

Swift 2.0でStringはどうなったか - 特殊文字などの扱い

イメージ
Objective-CのNSStringの仕様は自然ではなかったので、Swiftには期待しています。 Swift2.0でStringの仕様がだいぶ変わったということで検証してみます。 昔は何が困ったか 今回のStringの仕様の検証は、昔の仕様で困っていた部分が動機になっているので、まずそれを書きます。NSStringでは文字を基本的に16ビットで扱っていますが、文字の中には16ビットで扱えないものがあり、そういうものは32ビットなど他の長さで使用します。そのごちゃごちゃはUnicodeの仕様上仕方ないのですが、NSStringではその32ビット文字を2文字としてカウントするなどUnicodeのごちゃごちゃをうまくさばききれていなくて扱いが雑な部分がありました。 欲しいものは、内部で何ビットだろうとどういうどういうデータ状態であろうと、人間が一文字と認識するものは一文字として扱うというポリシーに従ったAPIです。 Swiftが発表になったときにUnicodeとの親和性もアピールしていたので期待しています。 The Swift Programming Languageを読む まずはいつものThe Swift Programming Languageで基本をおさらい。 ・Stringはvalue typeである(reference typeではない)。 ・Stringの文字列に含まれている個々の文字へのアクセスにはStringのcharactersプロパティからアクセス出来る。 ・SwiftのStringは内部ではUnicode scalarをベースにしている。Unicode scalarとは文字や記号に対応する21ビットの数。U+0000からU+D7FFとU+E000からU+10FFFFがある。U+D800からU+DFFFは含まない。U+が何かというのは大変ややこしいので割愛。 ・人間が文字と認識する形式がExtended Grapheme Cluster。SwiftのCharacterは一つのExtended Grapheme Clusterに対応。 一つのExtended Grapheme Clusterは一つ以上のUnicode scalarで構成される 。 ・Stringの文字数カウントはcharactersプロパティのcountプロ...