Slide 1

Slide 1 text

flatMap ͷ࿩ USAMI Kosuke Fenrir Inc.

Slide 2

Slide 2 text

͸͡Ίʹ • Swi% ͷ flatMap ʹ͍ͭͯ࿩͠·͢ • flatMap ͦͷ΋ͷ͸͍Ζ͍Ζͳݴޠʹ͋Γ·͢ • Op-onal ͷ flatMap • Array ͷ flatMap • Observable ͷ flatMap

Slide 3

Slide 3 text

flatMap ͷҹ৅ɾɾɾ • Α͘Θ͔Βͳ͍΋ͷͱ͍͏ҹ৅͕͋Δʁ • ίʔυ͕ಡΈͮΒ͘ͳΔʁ • ͳΜ͔ map ͯ͠ fla'en ͢Δ΍ͭʁ • ؔ਺ܕʁ Ϟφυʁ

Slide 4

Slide 4 text

flatMap • ݸਓతʹ͸ɺؾָʹ࢖͑͹͍͍ͱࢥ͏ • ࢖ͬͯ׳Εͯ͠·͑͹ɺ೉͍͠΋ͷͰ͸ͳ͍

Slide 5

Slide 5 text

Op#onal ͷ flatMap

Slide 6

Slide 6 text

Op#onal ͷ flatMap • ม׵લ : Optional • ม׵ॲཧ : T -> Optional • flatMap : Optional -> Optional • ม׵લ͕ non-nil ͳΒม׵ॲཧΛద༻͢Δ • ม׵લ͕ nil ͳΒม׵ॲཧΛద༻͠ͳ͍

Slide 7

Slide 7 text

ྫ • ม׵લ : Optional • ม׵ॲཧ : String -> Optional : { Int($0) } • string.flatMap { Int($0) } • "123" -> Int("123") -> 123 • "abc" -> Int("abc") -> nil • nil -> nil

Slide 8

Slide 8 text

nil ͷೖྗΛҙࣝ͠ͳ͍͍ͯ͘ // string ͸ Optional ͚ͩͲɾɾɾ let string: String? = "123" let integer: Int? = string.flatMap { Int($0) // $0 ͸ unwrap ͞Ε͍ͯΔ }

Slide 9

Slide 9 text

if let Ͱॻ͘ͱ৑௕ʹͳΔ let string: String? = "123" let integer: Int? if let string = string { integer = Int(string) } else { integer = nil }

Slide 10

Slide 10 text

Op#onal chaining ෩ʹ࢖͏ // Optional chaining string?.isEmpty // ಉ༷ʹ͜Μͳ΋ͷ͕ཉ͘͠ͳΔʁ string?.toInt // ୅ΘΓʹ͜͏͢Δ string.flatMap { Int($0) }

Slide 11

Slide 11 text

Array ͷ flatMap

Slide 12

Slide 12 text

Array ͷ flatMap • 2 छྨͷ flatMap ͕ଘࡏ͢Δ

Slide 13

Slide 13 text

Array ͷ flatMap (1) • ม׵લ : Array • ม׵ॲཧ : T -> Array • flatMap : Array -> Array

Slide 14

Slide 14 text

ྫ • ม׵લ : Array • ม׵ॲཧ : Int -> Array : { [$0, $0 * 10] } • [1, 2, 3].flatMap { [$0, $0 * 10] } • 1 -> [1, 10], 2 -> [2, 20], 3 -> [3, 30] • [1, 10, 2, 20, 3, 30]

Slide 15

Slide 15 text

Op#onal ͱ Array ͷ flatMap ൺֱ • ม׵લ : Optional • ม׵ॲཧ : T -> Optional • flatMap : Optional -> Optional • ม׵લ : Array • ม׵ॲཧ : T -> Array • flatMap : Array -> Array

Slide 16

Slide 16 text

flatMap ͷجຊܗ • ܕ T ΍ U ͕ೖͬͨԿΒ͔ͷശʢBoxʣ͕͋Δͱ͖ʹ • ม׵લ : Box • ม׵ॲཧ : T -> Box • flatMap : Box -> Box

Slide 17

Slide 17 text

Array ͷ flatMap (2) • ม׵લ : Array • ม׵ॲཧ : T -> Optional • flatMap : Array -> Array • ม׵ॲཧͷ݁Ռ͕ non-nil ͷ΋ͷ͕ Array ͷཁૉʹͳΔ • ม׵ॲཧͷ݁Ռ͕ nil ͷ΋ͷ͸ࣺͯΒΕΔ

Slide 18

Slide 18 text

ྫ • ม׵લ : Array • ม׵ॲཧ : String -> Optional : { Int($0) } • ["123", "abc"].flatMap { Int($0) } • "123" -> 123, "abc" -> nil • [123]

Slide 19

Slide 19 text

Array ͷ 2 ͭͷ flatMap ͷؔ܎ • flatMap (2) ͸ flatMap (1) Ͱ࣮ݱͰ͖Δ • non-nil Λฦ͢୅ΘΓʹ1ཁૉͷ Array Λฦ͢ • nil Λฦ͢୅ΘΓʹۭͷ Array Λฦ͢ • flatMap (2) ͷํ͕ίʔυ͕γϯϓϧʹͳΔ • flatMap (1) ͸࣮͸͋Μ·Γ࢖Θͳ͍

Slide 20

Slide 20 text

׆༻ྫ • ["A", "B", nil, "C"] : [String?] • ͔͜͜Β nil ΛऔΓআ͍ͨ [String] ͕ཉ͍͠ // flatMap ͳ͠ͳΒɺ͜Μͳײ͡Ͱॻ͘ʁ ["A", "B", nil, "C"] .filter({ $0 != nil }) as! [String]

Slide 21

Slide 21 text

׆༻ྫ // ୯ʹ͜͏ॻ͚͹ྑ͍ ["A", "B", nil, "C"].flatMap { $0 } • ม׵લ : Array> • ม׵ॲཧ : Optional -> Optional • flatMap : Array> -> Array

Slide 22

Slide 22 text

flatMap Λ׆༻͢Δ৔໘ • Op$onal ͱͷ૬ੑ͕ྑ͍ • Op$onal Λѻ͏ॲཧ͕͋Δͱ͖ʹ࢖͑ͳ͍͔ߟ͑Δͱྑ͍

Slide 23

Slide 23 text

ࢀߟɿଞʹ flatMap ͕࢖͑Δ΋ͷ • Result ܕʢan+typical/Resultʣ • Op+onal ͱ΄΅ಉ͡ʢnil ͷ୅ΘΓʹ۩ମతͳ Error Λฦ͢ʣ • Observable ܕʢRxSwi:ʣ • ඇಉظετϦʔϜɺ్தͰΤϥʔʹͳͬͨ৔߹ͷରԠ͕༰қ

Slide 24

Slide 24 text

Observable ͷ flatMap

Slide 25

Slide 25 text

Observable ͷ flatMap • ม׵લ : Observable • ม׵ॲཧ : T -> Observable • flatMap : Observable -> Observable • ม׵લ͕ .next ͳΒม׵ॲཧΛద༻͢Δ • ม׵લ͕ .error / .complete ͳΒม׵ॲཧΛద༻͠ͳ͍

Slide 26

Slide 26 text

ྫ Observable.of("123", "abc") .flatMap { string -> Observable in if let integer = Int(string) { return Observable.just(integer) } else { return Observable.empty() } } // -> [.next(123), .completed] • ิ଍ɿ্هͷ if let ͸ Op*onal ͷ flatMap Ͱॻ͘ͱεοΩϦ͢ Δ

Slide 27

Slide 27 text

Observable ͷ flatMap ͷ஫ҙ఺ • ม׵ॲཧ : T -> Observable • flatMap : Observable -> Observable • ม׵ॲཧʹΑͬͯੜ੒͞Εͨ Observable ΛɺflatMap ͸ Ͳ͏݁߹ͯ͠࠷ऴతͳ Observable ʹ͢Δ͔ʁ • Op*onal ΍ Array ͷ৔߹ʹ͸ฆΕ͸ͳ͔ͬͨ • Observable ͸݁߹ͷ࢓ํ͕ෳ਺͋Δ

Slide 28

Slide 28 text

flatMap Ͱͷ݁߹ॲཧ • flatMap ͸ Observable Λ merge Ͱ݁߹͢Δʢconcat Ͱ͸ͳ ͍ʣ

Slide 29

Slide 29 text

ଞͷ݁߹Λߦ͏ flatMap • flatMapLatest ͸ switchLatest Ͱ݁߹͢Δ

Slide 30

Slide 30 text

flatMap Λ্खʹ׆༻͠Α͏