Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
ܧଓ͠ͱܖʹΑΔઃܭ Continuation-Passing Style and Design By Contract by. 2019/3/19 try! Swift Pre Talks 2019 1
Slide 2
Slide 2 text
takasek @takasek Works OSS: ActionClosurable App: PasteTheType Articles ʮίϯύΠϧΤϥʔϥϯλΠϜΤϥʔΛ͍ͯ͘͠ ͚ͩͰiOSΞϓϦͷ࡞Γํ͕Θ͔ΔϓϩδΣΫτʯ ʮ͓લΒ͕ModelͱݺͿΞϨΛͳΜͱݺͿ͖͔ʯ ʮiOSΞϓϦઃܭύλʔϯೖʯʢڞஶʣ 2
Slide 3
Slide 3 text
ʮiOSΞϓϦઃܭύλʔϯೖʯ ධൃചதʂ https://peaks.cc/takasek/iOS_architecture takasek୲ষ ୈ1ষʮઃܭ͢Δͱ͍͏͜ͱʯ ୈ2ষʮઃܭʹύλʔϯΛద༻͢Δલʹʯ ୈ3ষʮSwiftΒ͘͠ઃܭ͢Δʯ ୈ4ষʮΞʔΩςΫνϟͷύλʔϯΛௗᛌ͢ Δʯ 3
Slide 4
Slide 4 text
ܧଓ͠ Continuation- Passing Style(CPS) 4
Slide 5
Slide 5 text
// Without CPS func doSomething(i: Int) -> String { sleep(100) return "\(i)" } // With CPS func doSomething(i: Int, completion: @escaping (String) -> Void) { DispatchQueue.global().async { sleep(100) completion("\(i)") } } 5
Slide 6
Slide 6 text
! 6
Slide 7
Slide 7 text
func doSomething( i: Int, completion: @escaping (String) -> Void ) ͜ͷΠϯλϑΣʔεʹɺخ͘͠ͳ͍͕͋Γ·͢ 7
Slide 8
Slide 8 text
ʮ͋ͬɺಡΊͨʯ 8
Slide 9
Slide 9 text
ʮίʔϧόοΫࠈͷͰ͠ΐʯ 9
Slide 10
Slide 10 text
ҧ͍·͢ 10
Slide 11
Slide 11 text
ܖʹΑΔ ઃܭ Design By Contract 11
Slide 12
Slide 12 text
ܖʹΑΔઃܭ Design By Contract ΦϒδΣΫτࢦΛΊͨݚڀऀ όʔτϥϯυɾϝΠϠʔʹΑΔɺ ৴པੑͷߴ͍γεςϜΛ ߏங͢ΔͨΊͷΞΠσΞ 12
Slide 13
Slide 13 text
ܖʹΑΔઃܭ ͋Δϧʔνϯ͕ɺݺΕΔ૬खͱͷؒͰऔΓަΘܾ͢Ί͝ͱΛʮද໌ʯ͢Δ • ࣄલ݅ɿ ݺͿଆ͕͜ͷ݅Λอূ͢Δ߹ͷΈɺϧʔνϯॲཧΛਖ਼͘͠ߦ͏ ҾͷܕͳͲͰදݱՄೳ • ࣄޙ݅ɿ ࣄલ͕݅कΒΕ͍ͯͨΒɺϧʔνϯͷ࣮ߦ݁Ռ͕อূ͢Δ݅ ΓͷܕͳͲͰදݱՄೳ ࣄલ͕݅ഁΒΕɺࣄޙ݅ΛकΕͳ͍߹ྫ֎͕ൃੜ͢Δ • ෆม݅ ʹ͍ͭͯࠓճলུ 13
Slide 14
Slide 14 text
ίʔυͱද໌ͷ۩ମྫ func half(of i: Int) throws -> Int { assert(i.isMultiple(of: 2)) if !i.isMultiple(of: 2) { throw Error.isOdd } return i / 2 } • ࣄલ݅: • Int ͔͠ड͚͚ͭ·ͤΜ • ۮ͔͠ड͚͚ͭ·ͤΜ (ܕͱͯ͠දݱෆೳ) • ࣄޙ݅: ඞͣ Int Λฦ͠·͢ • ྫ֎: ۮͰͳ͔ͬͨ߹ྫ֎Λ͛·͢ 14
Slide 15
Slide 15 text
ʮܖʹΑΔઃܭʯͷ࣮ݱͷͨΊʹɺSwiftͷܕ͚େཱ͖͍ͬͯ͘Δ 15
Slide 16
Slide 16 text
ͯ͞ 16
Slide 17
Slide 17 text
func half(of i: Int) throws -> Int { if !i.isMultiple(of: 2) { throw Error.isOdd } return i / 2 } ͜ΕΛCPSʹมͯ͠Έ·͠ΐ͏ 17
Slide 18
Slide 18 text
func half(of i: Int, completion: (Int) -> Void) { if !i.isMultiple(of: 2) { return } completion(i / 2) } 18
Slide 19
Slide 19 text
19
Slide 20
Slide 20 text
OK, حͷ߹ ֬ೝ͠Α͏ʂ 20
Slide 21
Slide 21 text
21
Slide 22
Slide 22 text
ݺΕͳ͍…ʁ 22
Slide 23
Slide 23 text
23
Slide 24
Slide 24 text
completionͷ ݺͼ࿙Ε 24
Slide 25
Slide 25 text
func half(of i: Int, completion: (Int) -> Void) { if !i.isMultiple(of: 2) { return // ! } completion(i / 2) } 25
Slide 26
Slide 26 text
enum Result { case success(T) case error(Error) } func half(of i: Int, completion: (Result) -> Void) { if !i.isMultiple(of: 2) { return // ! } completion(.success(i / 2)) } 26
Slide 27
Slide 27 text
enum Result { case success(T) case error(Error) } func half(of i: Int, completion: (Result) -> Void) { if !i.isMultiple(of: 2) { completion(.error(.isOdd)) // } completion(.success(i / 2)) } 27
Slide 28
Slide 28 text
ͬͨʂ ͏ҰڍಈΛ ֬ೝ͠Α͏ʂ 28
Slide 29
Slide 29 text
29
Slide 30
Slide 30 text
2ݺΕ͍ͯΔ …ͩͱ…ʁ 30
Slide 31
Slide 31 text
func half(of i: Int, completion: (Result) -> Void) { if !i.isMultiple(of: 2) { completion(.error(.isOdd)) // ! } completion(.success(i / 2)) } 31
Slide 32
Slide 32 text
func half(of i: Int, completion: (Result) -> Void) { if !i.isMultiple(of: 2) { completion(.error(.isOdd)) return // ! } completion(.success(i / 2)) } 32
Slide 33
Slide 33 text
ܧଓ͠ελΠϧΛ͏ͱ ੩తܕ͚ͷԸܙΛ ड͚ΒΕͳ͍ 33
Slide 34
Slide 34 text
ͳͥͳͷ͔ ΓͷܕʹΑͬͯ ࣄޙ݅ΛදݱͰ͖ͳ͍͔Β (T, (U) -> Void) -> Void Void࠷ऑͷࣄޙ݅ 34
Slide 35
Slide 35 text
Ͳ͏͢Ε͍͍͔ ΓͷܕʹΑͬͯ ࣄޙ݅Λදݱ͢Ε͍͍ (T) -> XXX ʮ͍ͣΕ݁Ռ͕ಘΒΕΔʯ͜ͱΛܕ͚ͰࣔͤΕɺ ඇಉظॲཧͰΓΛػೳͤ͞ΒΕΔ 35
Slide 36
Slide 36 text
func half(of i: Int) -> RxSwift.Single { if !i.isMultiple(of: 2) { return .error(Error.isOdd) } return .just(i / 2) } ͜ΕͳΒ੩తܕ͚ͷԸܙΛड͚ͭͭɺ ʮඇಉظͰ͋Δ͜ͱʯΛදݱͰ͖Δ 36
Slide 37
Slide 37 text
• Promise(Future) ύλʔϯ • PromiseK • Hydra • RxSwift • etc • async/await • comming soon in Swift 5.x!? • ͜ͷݴޠ༷Λϕʔεʹ Future ܕΛߏஙՄೳ CPSΛશ໘తʹஔ͖͔͑Մೳ͔ͱ͍͏ͱ͍͕͠ɺ બࢶΛͬͨ͏͑ͰύλʔϯΛબͼ͍ͨ 37
Slide 38
Slide 38 text
݁ ɾਓؒϛεΛ͠·͢ ɾϛεΛ͢Δલʹɺ ද໌ΛίϯύΠϥ͕͔ΔܗͰॻ͚ͳ͍͔ ҙࣝ͠ͳ͕Βઃܭ͠·͠ΐ͏ 38
Slide 39
Slide 39 text
͓·͚ ͱͯ5ͰޠΓ͖Εͳ͍ 39
Slide 40
Slide 40 text
ʮද໌ʯʹ͍ͭͯͷิ • ҾɾΓͷܕ͚͕ͩද໌Ͱͳ͍ͱݴ͚ͬͨΕͲ… • assert ͚ͩͰͳ͘ɺSwiftͰݴ͑ generics conditional conformanceද໌ͷํ๏ • ͭʹɺίϯύΠϥղऍෆೳͳද໌ྑ͘ͳ͍…Θ͚Ͱͳ͍ • දݱྗΛ্͛Δͱֶशίετɾෳࡶੑ͕ϖΠ͠ͳ͍͜ͱଟ͍ͷͰɺͦ͜όϥϯε • ͨͱ͑ɺڽͬͨprotocolͷwhere۟ɺৗਓʹཧղग़དྷΔ͔ͬͯݴΘΕΔͱݫ͍͠ΑͶ… ɹ 40
Slide 41
Slide 41 text
ิͷิ ٯʹݴ͑ɺ ܖʹΑΔઃܭ ݴޠΛΘͣద༻Մೳͳ֓೦Ͱ͢ t_wada͞ΜʹΑΔ ͋͑ͯPHPΛϕʔεʹͨ͠εϥΠυ PHPer͡Όͳͯ͘ΦεεϝͰ͢ https://speakerdeck.com/twada/php- conference-2016 41
Slide 42
Slide 42 text
ʮܧଓ͠ʯʹ͍ͭͯͷิ • ࣮ async/awaitʮ෦తͳCPSมʯͦͷͷͱ͍͑·͢ Continuation Passing Style Revisited – Fabulous Adventures In Coding https://blogs.msdn.microsoft.com/ericlippert/2010/10/21/ continuation-passing-style-revisited-part-one/ ͦͷ༁ matarillo.com: ܧଓ͠ελΠϧ(CPS)ͱඇಉظߏจ(async/await) https://matarillo.com/general/cps 42
Slide 43
Slide 43 text
Swiftͷ async/await ͱ ܧଓͱ Future ͷؔ Chris Lattnerͷproposal2ʹΑΔͱɺ • ଞͷݴޠͰ Future ͕·ͣ͋ͬͯɺͦͷ্ʹasync/await͕͔͍ͬͬͯΔ • Swiftͷasync/awaitͷઃܭͰͦΕΛલఏͱͤͣɺܧଓΛͦͷ··ѻ͏खஈΛ࿐ग़͍ͤͯ͞ Δ • ͱ͍͑ Future ͱ͍͏ܕ͚͞Εͨঢ়ଶͰѻ͏ΠϯλϑΣʔεߏஙՄೳͰ͢Αɺͱ͍͏͜ͱ 2 https://gist.github.com/lattner/429b9070918248274f25b714dcfc7619 yimajo͞Μͷʮasync/awaitݚڀಡຊʯ͋ΘͤͯͲ͏ͧ 43
Slide 44
Slide 44 text
ؔ࿈ɿʮܖʹΑΔઃ ܭʯΛΩʔϫʔυͰ֦ ு͢Δ ʮܖʹΑΔઃܭʯʹ͍ͭͯৄղ͞Ε ͍ͯΔʮΦϒδΣΫτࢦೖʯʹ ɺ ඇಉظʢฒߦʣॲཧΛͱʹ֦ுͨ͠ ߹ͷܖͷϙϦγʔʹ͍ͭͯͷٞ ͋Γ·͢ ໘ന͍Αʂ 44