More Related Content Similar to Swiftをキめると 気持ちいい! (18) More from Takaaki Tanaka (6) Swiftをキめると 気持ちいい!2. About Me
• 田中 孝明 (Takaaki Tanaka)
• クラスメソッド株式会社
• @kongmingtrap
• iOS Developer (Swift / Objective-C)
• GyazSquare / GitHub
12. map / flatmap
• Optional
• SequenceType
• Collection
• FlatMap
適用されている者たち
13. map / flatmap
public func map<U>(
_ transform: @noescape (Wrapped) throws -> U
) rethrows -> U? {
switch self {
case .some(let y):
return .some(try transform(y))
case .none:
return .none
}
}
17. Sequence
let types = ["Grass", "Water", "Fire", "Electric"]
let pokemonTypes =
types.map { PokemonType(rawValue: $0) }
[Optional(PokemonType.Grass), Optional(PokemonType.Water),
Optional(PokemonType.Fire), Optional(PokemonType.Electric)]
結果がOptionalになる
18. Sequence
let types = ["Grass", "Water", "Fire", "Electric"]
let pokemonTypes =
types.flatMap { PokemonType(rawValue: $0) }
[PokemonType.Grass, PokemonType.Water,
PokemonType.Fire, PokemonType.Electric]
結果がunwrapされる
19. Sequence
let types = ["Grass", "Water", "Fire", "Ice"]
let pokemonTypes =
types.map { PokemonType(rawValue: $0) }
[Optional(PokemonType.Grass), Optional(PokemonType.Water),
Optional(PokemonType.Fire), nil]
愚直に結果を返す
20. Sequence
let types = ["Grass", "Water", "Fire", "Ice"]
let pokemonTypes =
types.flatMap { PokemonType(rawValue: $0) }
[PokemonType.Grass, PokemonType.Water,
PokemonType.Fire]
結果がunwrapされ、nilが打ち消される
21. Collection
let types1 = ["Electric", "Electric", "Fire"]
let types2 = ["Water", "Ice"]
let types3 = ["Fire", "Grass", "Rock", "Grass"]
let types = [types1, types2, types3].map { $0 }
[["Electric", "Electric", "Fire"], ["Water", "Ice"],
["Fire", "Grass", "Rock", "Grass"]]
22. Collection
let types1 = ["Electric", "Electric", "Fire"]
let types2 = ["Water", "Ice"]
let types3 = ["Fire", "Grass", "Rock", "Grass"]
let types = [types1, types2, types3].flatMap { $0 }
["Electric", "Electric", "Fire", "Water", "Ice",
"Fire", "Grass", "Rock", "Grass"]
結果がflatなArrayになる
23. Collection
let types1 = ["Electric", "Electric", "Fire"]
let types2 = ["Water", "Ice"]
let types3 = ["Fire", "Grass", "Rock", "Grass"]
let types = [types1, types2, types3].flatMap
{ $0 }.flatMap { PokemonType(rawValue: $0) }
[PokemonType.Electric, PokemonType.Electric, PokemonType.Fire,
PokemonType.Water, PokemonType.Fire, PokemonType.Grass, PokemonType.Grass]
nilが打ち消されるため、欲しいデータだけ残る
24. Optional
let value: String? = "Fire"
let value1 = value.map { PokemonType(rawValue: $0) }
Optional(Optional(PokemonType.Fire))
結果が二重のOptionalになる
25. Optional
let value: String? = "Fire"
let value1 = value.flatMap { PokemonType(rawValue:
$0) }
Optional(PokemonType.Fire)
結果のOptionalが打ち消される(unwrapされる)
26. Optional
let type = PokemonType(rawValue: "Water")
let changedType = pokemon.map { type -> PokemonType in
switch type {
case .Water:
return PokemonType.Electric
default:
return type
}
}
Optional(PokemonType.Electric)
unwrapして値を取り扱う
27. Optional
let value1: Int? = 10
let value2: Int? = 20
let value = value1.flatMap {
v1 in value2.map { v2 in v1 + v2 } }
Optional(30)
Optional同士の値の計算