しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swift再入門30 − The Swift Programming Languageを読んでみる

この記事では「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) }