Slide 1

Slide 1 text

Result V.S. Result 2017/11/21 ؔ੢ϞόΠϧΞϓϦݚڀձ in ؔ౦ Yasuhiro Inami / @inamiy

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

// Proposal, Τϥʔܕύϥϝʔλͳ͠ public enum Result { case success(Value) case failure(Swift.Error) } // V.S. // Τϥʔܕύϥϝʔλ͋Γ public enum Result { case success(Value) case failure(Error) }

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Result (V.S. Result) • GOOD: ResultʹΤϥʔܕΛຒΊࠐΉ͜ͱ͕Ͱ͖Δ • ͲͷΤϥʔ͕ɺͲ͔͜Β΍ͬͯ͘Δ͔Λ஌Δ͜ͱ͕Ͱ͖Δ ʢΤϥʔυϝΠϯ͕ܕ͔Β൑அͰ͖Δʣ • ύλʔϯϚονϯά͕໢ཏత • BAD: υϝΠϯຖʹΤϥʔܕͷม׵͕ඞཁ • େྔͷ mapError ม׵ͱɺωετͨ͠enumΤϥʔܕఆٛ

Slide 8

Slide 8 text

BADͳਓͨͪᐌ͘ɺ ʮύλʔϯϚονϯάͰ ΤϥʔॲཧʢέʔεΛ໢ཏʣ Λ͢Δඞཁੑ͕΄ͱΜͲͳ͍ ͷͰɺΤϥʔܕ͸ඞཁͳ͍ʯ ʮ΋͠෼ذ͕ඞཁͰ͋Ε͹ɺ as?ΩϟετΛ࢖͑͹े෼ʯ

Slide 9

Slide 9 text

Ͱ΋GOODͳਓͨͪ͸ ͜͏ݴ͏ Τϥʔܕ͸ɺ ΤϥʔॲཧΛ͢Δ ͨΊ͚ͩʹ࢖͏΋ ͷͰ͸ͳ͍

Slide 10

Slide 10 text

NoError Uninhabited (empty) error type

Slide 11

Slide 11 text

NoError ͱ͸ʁ • enum NoError: Swift.Error {} • ஋Λੜ੒͢Δ͜ͱ͕Ͱ͖ͳ͍ (ྫɿNever) • NoError ΋·ͨ Error • ୅਺తσʔλܕʹ͓͚Δʮ0ʯ • θϩܕʢϘτϜʣ͕͋Δͱɺܕͷදݱ͕ΑΓ๛͔ʹͳΔ

Slide 12

Slide 12 text

// ࢖༻ྫɿReactiveSwift ͷ UI Binding // (`Error == NoError` ͷΈͰ࢖͑Δ) static func <~ ( provider: Self, source: Source ) -> Disposable? where Source.Value == Value, Source.Error == NoError { ... } // Bindingྫ (Note: Signal = Hot Observable) let alphaSignal: Signal = ... view.reactive.alpha <~ alphaSignal

Slide 13

Slide 13 text

NoError ͷ࢖༻ྫ • Signal • ΤϥʔΛྲྀ͞ͳ͍ Observable • RxSwift.Driver ౳ͷผͷܕΛ༻ҙ͢Δඞཁ͕ͳ͍ • Result • ੒ޭͷΈΛѻ͏ʢ ResultͰ͸දݱͰ͖ͳ͍ʣ • ී௨ʹ Value Λ࢖͑͹ྑ͍Μ͡Όʁ → ྑ͘ͳ͍

Slide 14

Slide 14 text

Result Value ͷཧ༝ ΋͠ɺObservable -> Result ʹม׵͢Δؔ਺ ͕͋Δ৔߹ʢྫɿ ReactiveSwift.firstʣ // Note: SignalProducer = Cold Observable extension SignalProducer { public func first() -> Result? { ... } }

Slide 15

Slide 15 text

Result Value ͷཧ༝ ΋͠ɺΤϥʔܕύϥϝʔλͷͳ͍ Resultͷੈքͩͱɾɾɾ extension SignalProducer { public func first() -> Result? { ... } } extension SignalProducer where Error == NoError { // ઈରʹΤϥʔ͠ͳ͍ͷͰɺ͜͜Ͱ͸`Result?` Λ࢖͍ͨ͘ͳ͍ public func first() -> Value? { ... } } ແବʹΦʔόʔϩʔυΛॻ͘ඞཁ͕ൃੜ !"

Slide 16

Slide 16 text

਺ֶʢݍ࿦ʣతʹݴ͏ͱɾɾɾ • Result Value • ྆ऀ͸ʮಉ͡ܕʯͰ͸ͳ͍͕ɺʮಉܕʢisomorphicʣʯ • ૬ޓม׵Ͱ͖Δʢٯࣹ͕ଘࡏʣ • ܕʹͩ͜ΘΔ → දݱྗ্͕͕Δ → ந৅ԽͰ͖Δ • Result ΍ Observable ͸දݱྗʹ๡͍͠ • NoError (θϩͷଘࡏ) ͸Ғେ

Slide 17

Slide 17 text

Swift Poem: Why I prefer typed error https://gist.github.com/inamiy/ e3f5f7524f1bcdc582c2ff8dbbba58dd

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Thanks! Yasuhiro Inami @inamiy