Upload
takaaki-tanaka
View
48
Download
0
Embed Size (px)
Citation preview
Swiftをキめると 気持ちいい!
AKIBA.swift #04
About Me • 田中 孝明 (Takaaki Tanaka)
• クラスメソッド株式会社
• @kongmingtrap • iOS Developer (Swift / Objective-C)
• GyazSquare / GitHub
皆様
Swift 書いていますか?
Objective-Cから入ってきた方々
ツラくないですか?
僕はツラかったです。
それから。。。色々あり。。。
便利な関数を使って 簡潔に書くようにすることで 書くのが楽しくなってきました。
便利な関数
• forEach • map • reduce • filter • flatmap
便利な関数
• forEach • map • reduce • filter • flatmap
map / flatmap
• Optional • SequenceType • Collection • FlatMap
適用されている者たち
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 } }
細かい説明は省いて後にして使ってみよう
map / flatMapで 動作を比べてみる
Example
enum PokemonType: String { case Grass = "Grass" case Water = "Water" case Fire = "Fire" case Electric = "Electric" }
ある時こんなEnumがおりました。
Sequencelet 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になる
Sequencelet types = ["Grass", "Water", "Fire", "Electric"] let pokemonTypes = types.flatMap { PokemonType(rawValue: $0) }
[PokemonType.Grass, PokemonType.Water, PokemonType.Fire, PokemonType.Electric]
結果がunwrapされる
Sequencelet types = ["Grass", "Water", "Fire", "Ice"] let pokemonTypes = types.map { PokemonType(rawValue: $0) }
[Optional(PokemonType.Grass), Optional(PokemonType.Water), Optional(PokemonType.Fire), nil]
愚直に結果を返す
Sequencelet types = ["Grass", "Water", "Fire", "Ice"] let pokemonTypes = types.flatMap { PokemonType(rawValue: $0) }
[PokemonType.Grass, PokemonType.Water, PokemonType.Fire]
結果がunwrapされ、nilが打ち消される
Collectionlet 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"]]
Collectionlet 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になる
Collectionlet 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が打ち消されるため、欲しいデータだけ残る
Optional
let value: String? = "Fire" let value1 = value.map { PokemonType(rawValue: $0) }
Optional(Optional(PokemonType.Fire))
結果が二重のOptionalになる
Optionallet value: String? = "Fire" let value1 = value.flatMap { PokemonType(rawValue: $0) }
Optional(PokemonType.Fire)
結果のOptionalが打ち消される(unwrapされる)
Optionallet 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して値を取り扱う
Optionallet value1: Int? = 10 let value2: Int? = 20
let value = value1.flatMap { v1 in value2.map { v2 in v1 + v2 } }
Optional(30)
Optional同士の値の計算
まとめ
• 簡潔に書こう • Optionalと仲良く付き合おう • Playgroundを有効活用しよう
Thank You !!!