Swiftの新機能 Optional
-
Upload
yuichi-adachi -
Category
Technology
-
view
1.505 -
download
0
description
Transcript of Swiftの新機能 Optional
![Page 1: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/1.jpg)
Copylight © Classmethod, Inc.
Swiftの新機能!Optional
Classmethod, Inc!!
安達 勇一
1
![Page 2: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/2.jpg)
Copylight © Classmethod, Inc.
プログラミング言語 Swift
・AppleがWWDC2014で発表!・Xcode6-betaで利用可能!・ライセンス開発者同士の議論はNDAから外れる模様!・多くの言語のいいとこ取り!
2
![Page 3: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/3.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/4.jpg)
Copylight © Classmethod, Inc.
新しい概念 Optional
var assumedNum: Int! = ”111”.toInt() !if assumedNum { print(assumedNum) // 111 }
4
![Page 5: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/5.jpg)
Copylight © Classmethod, Inc. 5
?
![Page 6: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/6.jpg)
Copylight © Classmethod, Inc.
?のルール
6
・T?でenum Optional<T> のシンタックスシュガー!・T型、T?型の双方が代入可能!・値が存在しないかもしれないコンテキストが! 型に含まれている(Haskell :Maybeモナド)!
![Page 7: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/7.jpg)
Copylight © Classmethod, Inc.
?のルール!enum Optional<T>
7
enum Optional<T> { case None //値が存在しない場合 case Some(T) //値が存在する場合 }
![Page 8: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/8.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/9.jpg)
Copylight © Classmethod, Inc.
?のルール
9
・メソッドチェーンの際に?を挟むことで! None(= nil)の時は以降のメソッドが走らない! Some(T)の時はTに対して次のメソッドを適用する!!
![Page 10: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/10.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/11.jpg)
Copylight © Classmethod, Inc. 11
!
![Page 12: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/12.jpg)
Copylight © Classmethod, Inc.
!のルール
12
・T!でstruct ImplicitlyUnwrappedOptional<T>!
のシンタックスシュガー!・T型、T?型の双方を代入可能!・T?の型に!を適用すると! T?がSome(T)ならばTを返す! NoneならばRuntime Errorが起きる!・Tに!を適用するとコンパイルエラー
![Page 13: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/13.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/14.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/15.jpg)
Copylight © Classmethod, Inc.
!のルール
15
!・型そのものと、値を取得するときの返り値が異なる! Tを代入した時はTを返す! T?を代入した時、その中身がSome(T)ならばTを返す! Noneならばnil(=T?)を返す!・この仕組が暗黙的アンラップ型と呼ばれる所以
![Page 16: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/16.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/17.jpg)
Copylight © Classmethod, Inc.
!のルール
17
!・T!で宣言しておくとnilでないことがわかっている時に! 何回もT?に対して中身を表示する際に!を呼ばずに済む。!・T!に入ったnilに対してTのメソッドを呼んでも! ランタイムエラーを起こす。!-> if文等で中身が入っていることを確かめてから!を使う。
![Page 18: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/18.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/19.jpg)
Copylight © Classmethod, Inc. 19
T型
T?型 T!型
常に代入可能
常に代入不可
nil以外代入可
![Page 20: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/20.jpg)
Copylight © Classmethod, Inc. 20
T型
T?型 T!型
常に代入可能
常に代入不可
nil以外代入可
!を適用
![Page 21: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/21.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/22.jpg)
Copylight © Classmethod, Inc.
メソッドチェーン再考
22
func toInteger (string: String) -> Int? { return string.toInt() }
・このstruct外の関数に関しては! Stringからのメソッドチェーンが適用できない
![Page 23: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/23.jpg)
Copylight © Classmethod, Inc. 23
![Page 24: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/24.jpg)
Copylight © Classmethod, Inc.
メソッドチェーン再考
24
・.?は他の場合でもT? -> (T -> U?) -> U?型! の中置関数とみなせる。!
![Page 25: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/25.jpg)
Copylight © Classmethod, Inc.
メソッドチェーン再考
25
・.?は他の場合でもT? -> (T -> U?) -> U?型! の中置関数とみなせる。!・enum Optional<T> をHaskellのMaybe T とみなして! モナドとして扱えないか?
![Page 26: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/26.jpg)
Copylight © Classmethod, Inc.
メソッドチェーン再考
26
・.?は他の場合でもT? -> (T -> U?) -> U?型! の中置関数とみなせる。!・enum Optional<T> をHaskellのMaybe T とみなして! モナドとして扱えないか?!・Maybe モナドのバインド(>>=)を実装できれば! Optionalのコンテキストを保ったまま! 関数オブジェクトに次々に適用できる
![Page 27: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/27.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/28.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/29.jpg)
Copylight © Classmethod, Inc. 29
![Page 30: Swiftの新機能 Optional](https://reader031.fdocuments.net/reader031/viewer/2022020101/5593311d1a28ab0b648b4717/html5/thumbnails/30.jpg)