事情があってSwiftを触ってみた。さらっと覚えておくことと所感をメモしておく。
覚えておくこと
Optional型はアンラップするとき基本こう使う
if let unwrappedNonNilVariable = NillableVariable { something... }
Optional型な引数とそうでない引数でシグネチャは区別できないけどprotocolのconformabilityでは区別されてコンパイラは文句をいう
たとえばこんな問題、 UITableViewDelegateとUITableViewDataSourceを実装してUITableViewにconformableなViewControllerを実装するときに、ここらあたりを参考に実装して
class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { ... func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { return 0 } func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { return nil } }
とする、と、
MyViewContoller.swift:12:1: Type 'MyViewController' does not conform to protocol 'UITableViewDataSource'
なんやねん。ここでtableView: UITableView!
の!
はいらない。APIのアップグレードで要らなくなったらしい。というわけで、このコードを消さないで正しいシグネチャの関数を追加で書いた。どうもこのふるいメソッドの方を消すのを忘れていたらしい。
するとなぜか!
が付いている方のコードが動いてたりする。いまのバージョンのコンパイラは知らない。おそらくセレクタにシグネチャの区別は関係ないからだろう。protocolのconformabilityとセレクタの挙動にconsistencyはない。
rangeを使ったforの書き方と普通のforの書き方が違う
for y in 0..<height in { for x in 0..<width in { } }
for var y = 0; y < height; ++y { for var x = 0; x < width; ++x { } }
この前者にvarが要らないの、もしくは後者にvarが必要なのにconsistencyなんかないと思うが、仕様書いてる人は気づかなかったのかな。
クラスメソッドの引数ラベルは省略できないっぽい。コンストラクタも
普通の関数は大丈夫。不便じゃね?
数値型変数をNSLogしたい
ついつい忘れがち。
NSLog("%f", doubleVar.native)
とするか素直に
NSLog("\(doubleVar)")
とする。
並列プログラミングをしたい
Grand Central Dispatchを使う。これを使うと楽。 Simple synchronization functions for Swift, wrapping the Cocoa NSLocking classes
コンパイル中にXcodeが死ぬ
耐えろ。
APIがコロコロ変わる
耐えろ。
基本Appleが好きな人は全肯定なのであまりSwiftの悪口を言わない
Swiftって名前がぱくりだとか、アイコンもパクリだとか。 Swift について - Oh, you `re no (fun _ → more)
iPhone6 Plusの角で鼻の軟骨を砕かれます。
ジェネリックの扱いに関する理論的な公開文書はまだ無いようだ
たとえば関数定義は次の2通りでかける、ということは色んな所で言われている:
func fn1(x:Int) -> Int { return x * 2 }
と
let fn2 = { (x:Int) -> Int in return x * 2 }
で 答えは
となる、が。
func id<typeA>(x:typeA) -> typeA { var ret: typeA ret = x return ret }
と
let id2 = { <typeA>(x:typeA) -> typeA in var ret: typeA ret = x return ret }
後者は許されてない。公式になんでか書いてあるものは見つけられなかったのだけど、おそらく値多相の問題? 当然typeAが参照型の場合、問題が起こることが容易に予想される。 例えばこんな話
Swift extensions and generics — Swift Programming — Medium
なので、Swiftの言語的特性をフルに使ってどうこうするよりは平易なプログラムを書くほうが地雷は少ない。
let多相に関する参考資料
MLのlet多相とか値制限とかよく分からなかったので調べてみた - Homoiconic Days
OCamlテクニック/let-poly - ocaml-nagoya
http://logic.cs.tsukuba.ac.jp/~kam/lecture/complogic2013/inf-poly.pdf
あとコンパイル時の型解決に関する外観を得るのに良い参考資料:
http://logic.cs.tsukuba.ac.jp/~kam/lecture/plm2013/6b.pdf
Ocamlの日本語で読める(私が)最高の入門(だと思っている)資料:
http://www.math.nagoya-u.ac.jp/~garrigue/lecture/tsukuba07/tsukuba.pdf
あとTAPL:

- 作者: Benjamin C. Pierce,住井英二郎,遠藤侑介,酒井政裕,今井敬吾,黒木裕介,今井宜洋,才川隆文,今井健男
- 出版社/メーカー: オーム社
- 発売日: 2013/03/26
- メディア: 単行本(ソフトカバー)
- クリック: 68回
- この商品を含むブログ (10件) を見る
オーム社のページからは電子書籍版が買える。
型システム入門 プログラミング言語と型の理論 | オーム社eStore
一番重要:Apple公式資料
これ