Swiftの新機能 Optional

30
Copylight © Classmethod, Inc. Swiftの新機能 Optional Classmethod, Inc 安達 勇一   1

description

2014/6/6 @ M3 tech talk

Transcript of Swiftの新機能 Optional

Page 1: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

Swiftの新機能!Optional

Classmethod, Inc!!

安達 勇一  

1

Page 2: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

プログラミング言語 Swift

・AppleがWWDC2014で発表!・Xcode6-betaで利用可能!・ライセンス開発者同士の議論はNDAから外れる模様!・多くの言語のいいとこ取り!

2

Page 3: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

新しい概念 Optional

var numberString: String? = “1111” //{Some "1111"} !if let number = numberString?.toInt() { (number * 2).description // "2222" } else { "failed" }

3

Page 4: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

新しい概念 Optional

var assumedNum: Int! = ”111”.toInt() !if assumedNum { print(assumedNum) // 111 }

4

Page 5: Swiftの新機能 Optional

Copylight © Classmethod, Inc. 5

?

Page 6: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

?のルール

6

・T?でenum Optional<T> のシンタックスシュガー!・T型、T?型の双方が代入可能!・値が存在しないかもしれないコンテキストが! 型に含まれている(Haskell :Maybeモナド)!

Page 7: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

?のルール!enum Optional<T>

7

enum Optional<T> { case None //値が存在しない場合 case Some(T) //値が存在する場合 }

Page 8: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

?のルール!代入!!!!!

8

var str: String? = "some string" var temp = str str = “string" //{Some “string"} str = temp //{Some "some string"}

Page 9: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

?のルール

9

・メソッドチェーンの際に?を挟むことで! None(= nil)の時は以降のメソッドが走らない! Some(T)の時はTに対して次のメソッドを適用する!!

Page 10: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

?のルール!メソッドチェーン!!!!!

10

var numStr: String? = "123" var notNumStr: String? = "1s3" var newNumStr: String? = numStr?.toInt()?.description //{Some “123"} var newNotNumStr: String? = notNumStr?.toInt()?.description //nil

Page 11: Swiftの新機能 Optional

Copylight © Classmethod, Inc. 11

!

Page 12: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

!のルール

12

・T!でstruct ImplicitlyUnwrappedOptional<T>!

 のシンタックスシュガー!・T型、T?型の双方を代入可能!・T?の型に!を適用すると! T?がSome(T)ならばTを返す!    NoneならばRuntime Errorが起きる!・Tに!を適用するとコンパイルエラー

Page 13: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

!のルール!代入!!!!!

13

var num: Int! = 1111 // 1111 var notNumStr: String? = “1s3" num = "128".toInt() // 128 num = notNumStr?.toInt() // nil

Page 14: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

!のルール!T?型に!を適用する!!!!!T型に!を適用する

14

var notNumStr: String? = "1s3" var notNum: Int? = notNumStr?.toInt() notNumStr! // "1s3" var notInt: Int = notNum! // runtime error

var integer = 17 17! // !の適用先が違うとコンパイラに怒られる

Page 15: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

!のルール

15

!・型そのものと、値を取得するときの返り値が異なる! Tを代入した時はTを返す! T?を代入した時、その中身がSome(T)ならばTを返す!               Noneならばnil(=T?)を返す!・この仕組が暗黙的アンラップ型と呼ばれる所以

Page 16: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

!のルール!代入!!!!!

16

var num: Int! = 1111 // Intを代入してIntを返す var notNumStr: String? = “1s3" num = "128".toInt() // Int?を代入してIntを返す num = notNumStr?.toInt() // Int?を代入してnilを返す

Page 17: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

!のルール

17

!・T!で宣言しておくとnilでないことがわかっている時に! 何回もT?に対して中身を表示する際に!を呼ばずに済む。!・T!に入ったnilに対してTのメソッドを呼んでも! ランタイムエラーを起こす。!-> if文等で中身が入っていることを確かめてから!を使う。

Page 18: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

!のルール!if文で中身があることを確認!!!

18

var num: Int? = “123”.toInt() var notNum: Int! = “1s3”.toInt() if num { print(num! + 10) } if notNum { print(notNum + 10) }

Page 19: Swiftの新機能 Optional

Copylight © Classmethod, Inc. 19

T型

T?型 T!型

常に代入可能

常に代入不可

nil以外代入可

Page 20: Swiftの新機能 Optional

Copylight © Classmethod, Inc. 20

T型

T?型 T!型

常に代入可能

常に代入不可

nil以外代入可

!を適用

Page 21: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

メソッドチェーン再考

21

var numStr: String? = "123" var notNumStr: String? = "1s3" var newNumStr: String? = numStr?.toInt()?.description //{Some “123"} var newNotNumStr: String? = notNumStr?.toInt()?.description //nil

・numStrはString? !

・toInt()をString -> Int?型の関数とみなす!・.?はこの時 String? -> (String -> Int?) -> Int?型! の中置関数とみなせる。

Page 22: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

メソッドチェーン再考

22

func toInteger (string: String) -> Int? { return string.toInt() }

・このstruct外の関数に関しては! Stringからのメソッドチェーンが適用できない

Page 23: Swiftの新機能 Optional

Copylight © Classmethod, Inc. 23

Page 24: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

メソッドチェーン再考

24

・.?は他の場合でもT? -> (T -> U?) -> U?型! の中置関数とみなせる。!

Page 25: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

メソッドチェーン再考

25

・.?は他の場合でもT? -> (T -> U?) -> U?型! の中置関数とみなせる。!・enum Optional<T> をHaskellのMaybe T とみなして! モナドとして扱えないか?

Page 26: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

メソッドチェーン再考

26

・.?は他の場合でもT? -> (T -> U?) -> U?型! の中置関数とみなせる。!・enum Optional<T> をHaskellのMaybe T とみなして! モナドとして扱えないか?!・Maybe モナドのバインド(>>=)を実装できれば! Optionalのコンテキストを保ったまま! 関数オブジェクトに次々に適用できる

Page 27: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

Optional で Haskellの >>=

27

operator infix >>= { associativity left } !func >>=<A, B> (maybe: Optional<A>, acts: A -> Optional<B>) -> Optional<B> { switch maybe { case .None: return nil case let .Some(content): return acts(content) } }

Page 28: Swiftの新機能 Optional

Copylight © Classmethod, Inc.

func toInt8 (int: Int) -> Int8? { switch int { case Int(Int8.min)...Int(Int8.max): return Optional.Some(Int8(int)) default: return nil } } !var innerString: String? = "127" var outerString: String? = "128" innerString >>= toInteger >>= toInt8 // Some 127 outerString >>= toInteger >>= toInt8 // nil

28

Page 29: Swiftの新機能 Optional

Copylight © Classmethod, Inc. 29

Page 30: Swiftの新機能 Optional