8. やや新しい列挙型
列挙型
Raw 値の割り当て
定義
enum Basket : Int {
case Empty = 0
case Pineapple = 1
case Melon = 2
}
1. 列挙子に内部的な値を付与
2. Objective-C では必ず Raw 値が設定される
3. Swift で Raw 値がない列挙子は具体値なし
9. やや新しい列挙型
列挙型
列挙子から Raw 値を取得
Raw 値を取得
let raw = Basket.Melon.rawValue
Raw 値から列挙子を生成
列挙子を生成
let value = Basket(rawValue: raw)!
25. まったく新しい列挙型
Raw 値を文字列型にする…
定義
enum Basket : String {
case Empty = ""
case Pineapple = "Pineapple"
case Melon = "Melon"
}
1. 内部的な値を文字列で付与
2. 列挙子と文字列値とが関連付けられる
26. まったく新しい列挙型
Raw 値として文字列を取り出せる
Raw 値の取得
let string:String = Basket.Melon.rawValue
文字列から列挙子を生成することも可能
列挙子の生成
let value:Basket? = Basket(rawValue: "Melon")
48. 値が複数付いた列挙型
定義
Swift
enum Basket {
case Empty
case Fruit(String, Int)
case Animal(String, Int, Bool)
}
― タプル型で列挙子の値を定義 ―
値付き列挙型
49. 値付き列挙型
値が複数付いた列挙型
値を取り出して利用する
分岐と各値の判定・取得
let basket:Basket
switch basket {
case let .Fruit("りんご", price):
println("りんごは特売! (price)円!")
case let .Fruit(name, price):
println("(name)が(price)円!")
}
― 値を個別に取り出せる、どれか固定も可能 ―
50. 値が複数付いた列挙型
値を一括で取り出すことも可能
分岐と値の一括取得
let basket:Basket
switch basket {
case let .Fruit(value):
println("(value.0)が(value.1)円!")
}
― 値をタプル型で取り出せる ―
値付き列挙型
51. 値付き列挙型
値が複数付いた列挙型
名前付きタプルも利用可能
定義
enum Basket {
}
使用
case Empty
case Fruit(name: String, price: Int)
switch basket {
case let .Fruit(value):
println("(value.name)が(value.price)円!")
}
75. シンタックスシュガー
値が nil かを判定する
値があるかないかを if で判定
シンタックスシュガー
if str != nil {
}
else {
}
列挙型による実装
switch str {
case .Some:
…
case .None:
…
}
76. シンタックスシュガー
値が nil かを判定する
Optional Binding で値を取得
シンタックスシュガー
if let value = str {
}
else {
}
列挙型による実装
switch str {
case let .Some(value):
…
case .None:
…
}
77. シンタックスシュガー
Optional から値を取り出す
強制アンラップ
シンタックスシュガー
let value = str!
列挙型による実装
var value:String
switch str {
case let .Some(v):
value = v
case .None:
abort()
}
78. シンタックスシュガー
Optional から値を取り出す
nil 結合演算子(右辺が nil 非許容のとき)
シンタックスシュガー
let value = str ?? "DEFAULT"
列挙型による実装
var value:String
switch str {
case let .Some(v):
value = v
case .None:
value = "DEFAULT"
}
79. シンタックスシュガー
Optional から値を取り出す
nil 結合演算子(右辺が nil 許容のとき)
シンタックスシュガー
let value = str ?? Optional("DEFAULT")
列挙型による実装
var value:String?
switch str {
case let .Some:
value = str!
case .None:
value = Optional("DEFAULT")
}
80. シンタックスシュガー
Optional から値を取り出す
Optional Chaining で値を取得
シンタックスシュガー
let value = str?.hashValue
列挙型による実装
var value:Int?
switch str {
case let .Some(v):
value = v.hashValue
case .None:
value = nil
}
85. シンタックスシュガー
Optional から値を取り出す
Optional<T>.map<U> メソッドで実行
シンタックスシュガー
let value = str?.hashValue
Optional 型による実装
// いちばん短い書き方
let value = str.map { $0.hashValue }
// 省略しない書き方
let value = str.map({ (value:String) -> Int in
return value.hashValue
})
94. シンタックスシュガー
ImplicitlyUnwrappedOptional
nil 結合演算子は Optional と同等(nil 非許容)
シンタックスシュガー
let value = str ?? "DEFAULT"
列挙型による実装
var value:String
switch str {
case let .Some(v):
value = v
case .None:
value = "DEFAULT"
}
95. シンタックスシュガー
ImplicitlyUnwrappedOptional
nil 結合演算子は Optional と同等(nil 許容)
シンタックスシュガー
// 結果は Optional<T> で得られる
let value = str ?? Optional("DEFAULT")
列挙型による実装
var value:String?
switch str {
case let .Some:
value = str!
case .None:
value = Optional("DEFAULT")
}
96. シンタックスシュガー
ImplicitlyUnwrappedOptional
Optional Chaining は無くて暗黙アンラップ
シンタックスシュガー
//「?」はなく即時アンラップ(nil なら強制終了)
let value = str.hashValue
列挙型による実装
var value:Int
switch str {
case let .Some(v):
value = v.hashValue
case .None:
abort()
}