この記事では「The Swift Programming Language」を1から読んだ感想とか発見を書いてみようと思います。
「The Swift Programming Language」とはSwiftの公式ドキュメントでiBooksや下ページで見る事ができます。
The Swift Programming Language (Swift 2.1): About Swift
読んだ所
今回はExpressions
という項目を読みました。
The Swift Programming Language (Swift 2.1): Expressions
学んだこと
try演算子の順番
1行だけのtryは行全体にかかります。
その為try? method1() + method2()
はエラーになりません。
しかし()で影響範囲を限定するとエラーになります。
_ = try? method1() + method2() _ = try? (method1() + method2()) _ = (try? method1()) + method2() // → これだけエラー func method1() throws -> Int { return 1 } func method2() throws -> Int { return 1 }
is, as, as?, as!
isはそのクラスにキャスト可能ならtrue、キャスト不可ならfalseを返します。
print(UIView() is AnyObject) // → true print(1 is Any) // → true
asは確実にキャストできる時に使えます。
print(UIView() as AnyObject) print(1 as Any)
as?はキャスト失敗したらnilを返します、成功時はOptionalを返します。
print(UIView() as? NSDate) // → nil print(1 as? Any) // → Optional(1)
as!はキャスト失敗するとアプリがクラッシュします。
変数のキャプチャ
クロージャーの先頭で[a]とするとaをキャプチャします。
その後aに別の値を代入してもクロージャー内では0のままになります。
[unowned self]はこの機能を利用しています。
var a = 0 var b = 0 let closure = { [a] in print(a, b) } self.window = nil a = 10 b = 10 closure() // → 0 10と出力される
[]内では別の変数に代入する事もできます。
myFunction { [weak parent = self.parent] in print(parent!.title) }