29
Swiftをキめると 気持ちいい! AKIBA.swift #04

Swiftをキめると 気持ちいい!

Embed Size (px)

Citation preview

Page 1: Swiftをキめると 気持ちいい!

Swiftをキめると 気持ちいい!

AKIBA.swift #04

Page 2: Swiftをキめると 気持ちいい!

About Me • 田中 孝明 (Takaaki Tanaka)

• クラスメソッド株式会社

• @kongmingtrap • iOS Developer (Swift / Objective-C)

• GyazSquare / GitHub

Page 3: Swiftをキめると 気持ちいい!

皆様

Page 4: Swiftをキめると 気持ちいい!

Swift 書いていますか?

Page 5: Swiftをキめると 気持ちいい!

Objective-Cから入ってきた方々

Page 6: Swiftをキめると 気持ちいい!

ツラくないですか?

Page 7: Swiftをキめると 気持ちいい!

僕はツラかったです。

Page 8: Swiftをキめると 気持ちいい!

それから。。。色々あり。。。

Page 9: Swiftをキめると 気持ちいい!

便利な関数を使って 簡潔に書くようにすることで 書くのが楽しくなってきました。

Page 10: Swiftをキめると 気持ちいい!

便利な関数

• forEach • map • reduce • filter • flatmap

Page 11: Swiftをキめると 気持ちいい!

便利な関数

• forEach • map • reduce • filter • flatmap

Page 13: Swiftをキめると 気持ちいい!

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 } }

Page 14: Swiftをキめると 気持ちいい!

細かい説明は省いて後にして使ってみよう

Page 15: Swiftをキめると 気持ちいい!

map / flatMapで 動作を比べてみる

Page 16: Swiftをキめると 気持ちいい!

Example

enum PokemonType: String { case Grass = "Grass" case Water = "Water" case Fire = "Fire" case Electric = "Electric" }

ある時こんなEnumがおりました。

Page 17: Swiftをキめると 気持ちいい!

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になる

Page 18: Swiftをキめると 気持ちいい!

Sequencelet types = ["Grass", "Water", "Fire", "Electric"] let pokemonTypes = types.flatMap { PokemonType(rawValue: $0) }

[PokemonType.Grass, PokemonType.Water, PokemonType.Fire, PokemonType.Electric]

結果がunwrapされる

Page 19: Swiftをキめると 気持ちいい!

Sequencelet types = ["Grass", "Water", "Fire", "Ice"] let pokemonTypes = types.map { PokemonType(rawValue: $0) }

[Optional(PokemonType.Grass), Optional(PokemonType.Water), Optional(PokemonType.Fire), nil]

愚直に結果を返す

Page 20: Swiftをキめると 気持ちいい!

Sequencelet types = ["Grass", "Water", "Fire", "Ice"] let pokemonTypes = types.flatMap { PokemonType(rawValue: $0) }

[PokemonType.Grass, PokemonType.Water, PokemonType.Fire]

結果がunwrapされ、nilが打ち消される

Page 21: Swiftをキめると 気持ちいい!

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"]]

Page 22: Swiftをキめると 気持ちいい!

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になる

Page 23: Swiftをキめると 気持ちいい!

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が打ち消されるため、欲しいデータだけ残る

Page 24: Swiftをキめると 気持ちいい!

Optional

let value: String? = "Fire" let value1 = value.map { PokemonType(rawValue: $0) }

Optional(Optional(PokemonType.Fire))

結果が二重のOptionalになる

Page 25: Swiftをキめると 気持ちいい!

Optionallet value: String? = "Fire" let value1 = value.flatMap { PokemonType(rawValue: $0) }

Optional(PokemonType.Fire)

結果のOptionalが打ち消される(unwrapされる)

Page 26: Swiftをキめると 気持ちいい!

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して値を取り扱う

Page 27: Swiftをキめると 気持ちいい!

Optionallet value1: Int? = 10 let value2: Int? = 20

let value = value1.flatMap { v1 in value2.map { v2 in v1 + v2 } }

Optional(30)

Optional同士の値の計算

Page 28: Swiftをキめると 気持ちいい!

まとめ

• 簡潔に書こう • Optionalと仲良く付き合おう • Playgroundを有効活用しよう

Page 29: Swiftをキめると 気持ちいい!

Thank You !!!