Slide 1

Slide 1 text

Kotlin ͱൺֱͯ͠ཧղ͢Δ Swift 5 Ͱ࣮૷͞ΕΔ͔΋͠Εͳ͍ async/await ʹ͍ͭͯ גࣜձࣾΩϡϦΦγςΟιϑτ΢ΣΞ ࠓ৓ ળۣ @yiamjo QPUBUPUJQTJOϚωʔϑΥϫʔυࣾ

Slide 2

Slide 2 text

Swift 5 async/await ݚڀಡຊ IUUQTCPPUIQNKBJUFNT 0QUJPOBM ٕज़ಉਓࢽΛ࡞Γ·ͨ͠

Slide 3

Slide 3 text

ຊ୊

Slide 4

Slide 4 text

ݱࡏͷSwift 4.1͸ async/awaitΛαϙʔτ͍ͯ͠ͳ͍ - Xcode 10ͷSwift 4.2Ͱ΋async/await͸ͳ͍

Slide 5

Slide 5 text

2017/8 SwiftͷੜΈͷ਌ΫϦεࢯ͔Β async/awaitϓϩϙʔβϧͷυϥϑτ͕ Swift EvolutionͷMLʹ౤ߘ͞ΕΔ

Slide 6

Slide 6 text

͜ͷϓϩϙʔβϧʹ͍ͭͯ ಈػίϯϓϦʔγϣϯϋϯυϥ͸࠷దͰ͸ͳ͍ ղܾࡦ͸ίϧʔνϯ 0CK$Πϯϙʔλͷม׵ طଘػೳͱͷ૬ޓ࡞༻ աڈͷίʔυͱͷޓ׵ੑ "#*TUBCJMJUZ΁ͷӨڹ ଞͷγϯλοΫε ୅ସҊ কདྷతͳํ޲ੑ w ΫϩʔδϟͰίʔϧόοΫ͢Δͱίʔυ͕ωετ͍ͯͬͯ͠͠·͏ w ΤϥʔॲཧΛϋϯυϥ͝ͱʹॻ͘ͷ͸ࠔ೉ w ৚݅ʹΑͬͯΫϩʔδϟΛݺͼग़͢ͷ͸ۤ௧ w ؔ਺͕஋Λฦ͔͢ɺதஅ͢Δ͜ͱΛՄೳʹ͢Δ w δΣωϨʔλʢZJFMEʣ΍ඇಉظϞσϧͦͷଞͷػೳΛ࣮૷͢Δͷʹ࢖༻Ͱ͖Δ w ͜ͷϓϩϙʔβϧͰ͸ίϯϓϦʔγϣϯϋϯυϥͷଟ͘ͷ໰୊Λഉআ w ࠷΋ҰൠతͳϢʔεέʔεʹ޲໋໊͔ͬͯ๏ͱ༻ޠΛόΠΞε͢Δ w BTZOD͔ZJFMET͔ʹ͍ͭͯ͸ίΞηϚϯςΟΫεʹ͸ؔ܎͠ͳ͍ w ఏҊ͢ΔίϧʔνϯϞσϧ͸ΠϯλϑΣʔεͰ͸ͳ͍ w 0CK$ͷίϯϓϦʔγϣϯϋϯυϥϕʔεͷ"1*Λ 4XJGUͰ࢖͑ΔΑ͏ ม׵͢Δ w BTZODؔ਺΋UISPXTͰ͖ΔΑ͏ʹ͠ɺUSZBXBJUͰϋϯυϦϯάͰ͖ΔΑ͏ʹ͢Δ w ίϯύΠϥ͸Ϋϩʔδϟ͕ඇಉظ͔Ͳ͏͔؆୯ʹ൑ఆͰ͖Δ w EFGFS͸ίϧʔνϯ͕ഁغ͞Εͨࡍʹ΋ಈ࡞͢ΔΑ͏ʹ͢Δ w ʢϋϯυϥͳΒҾ਺Λ૿΍͕͢ʣBTZODͳSFUVSO͸݁ՌΛλϓϧͰฦͤΔ w ίϯύΠϥ͕ANZ2VFVFBTZOD\^Aͳهड़Λݕग़ͯ͠pYJUͰमਖ਼Ͱ͖Δ w "#*4UBCJMJUZʹӨڹ͠ͳ͍ w BTZODͳΒUISPXTͱ͢Δͱύλʔϯ͸ݮΔ͕ܽ఺͸͋Δ w BTZODͳΒσϑΥϧτUISPXTʹ͠ɺBTZOD OPOUISPXJOH ʹ͢Δͷ΋ܽ఺͸͋Δ w ίϧʔνϯΛ༻ҙ͍ͨ͠ͷͰ͋ͬͯBTZODBXBJUΛ࣮૷͍ͨ͠ͷͰ͸ͳ͍ w $ͷΑ͏ʹҰൠతͳBTZODBXBJU͸'VUVSFΫϥεΛฦ͢͜ͱʹͳΔ w ͦ͏ͳΔͱBTZODBXBJUΛݴޠϨϕϧͰ࣮૷͢Δ͜ͱʹͳͬͯ͠·͏ w ͜ͷఏҊ͸AYBXBJUGPP CBS AͷΑ͏ʹνΣΠχϯάΛ͏·͘Ͱ͖Δ w ۩ମྫ͸ͳ͍͕͜ͷఏҊ͔Βকདྷ΁ͷ֦ுੑɺ΍͍͖ͬͯΛड़΂͍ͯΔ

Slide 7

Slide 7 text

- 2017/8 Swift EvolutionͷϦϙδτϦʹSwift 5 ͷ༧ఆͱͯ͠ɺඇಉظॲཧͷ৽͍͠جૅΛ࡞ Δͱ͍͏͜ͱ͕௥ه͞Εͨ - https://github.com/apple/swift-evolution

Slide 8

Slide 8 text

ઌʹൃදͷ݁࿦Λ·ͱΊΔ

Slide 9

Slide 9 text

KotlinͱSwiftͷasync/awaitڞ௨఺ • Kotlinͷasync/await΍suspend͸ඇಉظؔ਺ʹ ΩʔϫʔυΛ෇͚Δ • Kotlinͷsuspend͕ಛʹSwiftͷʹࣅ͍ͯΔ • ͔͠͠ඍົͳҧ͍͕͋Δ

Slide 10

Slide 10 text

ͦ΋ͦ΋async/awaitͬͯ ԿΑʁ

Slide 11

Slide 11 text

async/await͸ ඇಉظॲཧΛಉظॲཧతʹ ίʔσΟϯάͰ͖Δ ඇಉظॲཧΛ଴ͭ ίʔϧόοΫ஍ࠈʹͳΒͳͯ͘ࡁΉͶʂ

Slide 12

Slide 12 text

Swift 5ͷυϥϑτʹ͋Δasync/awaitͷྫ // ඇಉظॲཧΛ࣮ߦ͠໭Γ஋Λͦͷ݁Ռͱ͢Δؔ਺ func loadWebResource(_ path: String) async -> Resource func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image func dewarpAndCleanupImage(_ i : Image) async -> Image // ඇಉظॲཧΛ࣮ߦ͠Web্͔ΒσʔλΛऔಘ͠ը૾Λͭ͘Δؔ਺ func processImageData1() async -> Image { let dataResource = await loadWebResource("dataprofile.txt") let imageResource = await loadWebResource(“imagedata.dat") let imageTmp = await decodeImage(dataResource, imageResource) let imageResult = await dewrapAndCleanupImage(imageTmp) return imageResult }

Slide 13

Slide 13 text

Swift 5ͷυϥϑτʹ͋Δasync/awaitͷྫ // ඇಉظॲཧΛ࣮ߦ͠໭Γ஋Λͦͷ݁Ռͱ͢Δؔ਺ func loadWebResource(_ path: String) async -> Resource func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image func dewarpAndCleanupImage(_ i : Image) async -> Image // ඇಉظॲཧΛ࣮ߦ͠Web্͔ΒσʔλΛऔಘ͠ը૾Λͭ͘Δؔ਺ func processImageData1() async -> Image { let dataResource = await loadWebResource("dataprofile.txt") let imageResource = await loadWebResource(“imagedata.dat") let imageTmp = await decodeImage(dataResource, imageResource) let imageResult = await dewrapAndCleanupImage(imageTmp) return imageResult } ؔ਺ఆٛ࣌ʹBTZODΛ͚ͭΔ

Slide 14

Slide 14 text

Swift 5ͷυϥϑτʹ͋Δasync/awaitͷྫ // ඇಉظॲཧΛ࣮ߦ͠໭Γ஋Λͦͷ݁Ռͱ͢Δؔ਺ func loadWebResource(_ path: String) async -> Resource func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image func dewarpAndCleanupImage(_ i : Image) async -> Image // ඇಉظॲཧΛ࣮ߦ͠Web্͔ΒσʔλΛऔಘ͠ը૾Λͭ͘Δؔ਺ func processImageData1() async -> Image { let dataResource = await loadWebResource("dataprofile.txt") let imageResource = await loadWebResource(“imagedata.dat") let imageTmp = await decodeImage(dataResource, imageResource) let imageResult = await dewrapAndCleanupImage(imageTmp) return imageResult } ؔ਺ఆٛ࣌ʹBTZODΛ͚ͭΔ BXBJUͰ݁ՌΛ଴ͬͯऔΓग़͢Α͏ʹ هड़Ͱ͖·͢

Slide 15

Slide 15 text

Kotlin 1.2.51ͷasync/await BTZODBXBJU͸·ͩFYQFSJNFOUBM͔ͩΒ ͙͢มߋ͞ΕΔ͔΋͠Εͳ͍Α

Slide 16

Slide 16 text

Kotlin async/awaitͰಉ͡ྫΛهड़ͯ͠ΈΔ fun loadWebResource(resource: String): Deferred = async { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ // @asyncͰDeferredίϯςφʹ͘Δ·ΕΔʁ return@async Resource() } fun processImageData1(): Deferred = async { val dataResource = loadWebResource("data.txt").await() val imageResource = loadWebResource("imagedata.dat").await() val imageTmp = decodeImage(dataResource, imageResource).await() val imageResult = dewrapAndCleanupImage(imageTmp).await() return@async imageResult }

Slide 17

Slide 17 text

Kotlin async/awaitͰಉ͡ྫΛهड़ͯ͠ΈΔ fun loadWebResource(resource: String): Deferred = async { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ // @asyncͰDeferredίϯςφʹ͘Δ·ΕΔʁ return@async Resource() } fun processImageData1(): Deferred = async { val dataResource = loadWebResource("data.txt").await() val imageResource = loadWebResource("imagedata.dat").await() val imageTmp = decodeImage(dataResource, imageResource).await() val imageResult = dewrapAndCleanupImage(imageTmp).await() return@async imageResult } %FGFSSFEΛฦ͢

Slide 18

Slide 18 text

Kotlin async/awaitͰಉ͡ྫΛهड़ͯ͠ΈΔ fun loadWebResource(resource: String): Deferred = async { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ // @asyncͰDeferredίϯςφʹ͘Δ·ΕΔʁ return@async Resource() } fun processImageData1(): Deferred = async { val dataResource = loadWebResource("data.txt").await() val imageResource = loadWebResource("imagedata.dat").await() val imageTmp = decodeImage(dataResource, imageResource).await() val imageResult = dewrapAndCleanupImage(imageTmp).await() return@async imageResult } BXBJU ͸%FGFSSFEίϯςφͷϝιου %FGFSSFEΛฦ͢

Slide 19

Slide 19 text

Kotlin way

Slide 20

Slide 20 text

Kotlin suspendͰಉ͡ྫΛهड़ suspend fun loadWebResource2(): Resource { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ͍ͯ͠Δײ͡ return Resource() } suspend fun processImageData2(): Image { val dataResource = loadWebResource2("data.txt") val imageResource = loadWebResource2("imagedata.dat") val imageTmp = decodeImage2(dataResource, imageResource) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult }

Slide 21

Slide 21 text

Kotlin suspendͰಉ͡ྫΛهड़ suspend fun loadWebResource2(): Resource { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ͍ͯ͠Δײ͡ return Resource() } suspend fun processImageData2(): Image { val dataResource = loadWebResource2("data.txt") val imageResource = loadWebResource2("imagedata.dat") val imageTmp = decodeImage2(dataResource, imageResource) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult } ؔ਺ଆʹTVTQFOEΩʔϫʔυ෇͚ͯ%FGFSSFEͰͳ͘஋Λฦ͢

Slide 22

Slide 22 text

Kotlin suspendͰಉ͡ྫΛهड़ suspend fun loadWebResource2(): Resource { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ͍ͯ͠Δײ͡ return Resource() } suspend fun processImageData2(): Image { val dataResource = loadWebResource2("data.txt") val imageResource = loadWebResource2("imagedata.dat") val imageTmp = decodeImage2(dataResource, imageResource) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult } ؔ਺ଆʹTVTQFOEΩʔϫʔυ෇͚ͯ%FGFSSFEͰͳ͘஋Λฦ͢ ݺͼग़͠ଆͰBXBJU͢Δඞཁ͕ͳ͘ͳΔ

Slide 23

Slide 23 text

͔͠͠… ͓෼͔Γ͍͚ͨͩͨͩΖ͏͔… ͜ͷྫͷsuspend͸ ແବʹ଴ͬͯ͠·͍ͬͯΔ

Slide 24

Slide 24 text

͜ͷॲཧͷແବͳͱ͜Ζ͸ʁ suspend fun loadWebResource2(): Resource { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ͍ͯ͠Δײ͡ return Resource() } suspend fun processImageData2(): Image { val dataResource = loadWebResource2("data.txt") val imageResource = loadWebResource2(“imagedata.dat") val imageTmp = decodeImage2(dataResource, imageResource) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult }

Slide 25

Slide 25 text

͜ͷॲཧͷແବͳͱ͜Ζ͸ʁ suspend fun loadWebResource2(): Resource { // ͦͷ··ฦ͚͢Ͳຊ౰͸ඇಉظॲཧ͍ͯ͠Δײ͡ return Resource() } suspend fun processImageData2(): Image { val dataResource = loadWebResource2("data.txt") val imageResource = loadWebResource2(“imagedata.dat") val imageTmp = decodeImage2(dataResource, imageResource) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult } MPBE8FC3FTPVSDF͸ؔ࿈͠ͳ͍ඇಉظॲཧͳͷͰ ͭಉ࣌ʹ࣮ߦͯ݁͠ՌΛ଴ͯ͹ޮ཰͍͍ͷͰ͸ʁ

Slide 26

Slide 26 text

Kotlin suspendΛasyncͰแΊ͹ෳ਺ॲཧͷ଴ͪ߹ΘͤͰ͖Δ suspend fun processImageData2(): Image { val dataResource = async { loadWebResource3(“data.txt”) } val imageResource = async { loadWebResource3(“imagedata.dat”) } val imageTmp = decodeImage2(dataResource.await(), imageResource.await()) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult }

Slide 27

Slide 27 text

Kotlin suspendΛasyncͰแΊ͹ෳ਺ॲཧͷ଴ͪ߹ΘͤͰ͖Δ suspend fun processImageData2(): Image { val dataResource = async { loadWebResource3(“data.txt”) } val imageResource = async { loadWebResource3(“imagedata.dat”) } val imageTmp = decodeImage2(dataResource.await(), imageResource.await()) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult } TVTQFOEͳؔ਺ͦͷ··ΛBTZODͰ͘ΔΜͰ%FGFSSFEʹ

Slide 28

Slide 28 text

Kotlin suspendΛasyncͰแΊ͹ෳ਺ॲཧͷ଴ͪ߹ΘͤͰ͖Δ suspend fun processImageData2(): Image { val dataResource = async { loadWebResource3(“data.txt”) } val imageResource = async { loadWebResource3(“imagedata.dat”) } val imageTmp = decodeImage2(dataResource.await(), imageResource.await()) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult } TVTQFOEͳؔ਺ͦͷ··ΛBTZODͰ͘ΔΜͰ%FGFSSFEʹ %FGFSSFEͳͷͰBXBJU Ͱ͖ΔΑ͏ʹͳͬͨ

Slide 29

Slide 29 text

Kotlin suspendΛasyncͰแΊ͹ෳ਺ॲཧͷ଴ͪ߹ΘͤͰ͖Δ suspend fun processImageData2(): Image { val dataResource = async { loadWebResource3(“data.txt”) } val imageResource = async { loadWebResource3(“imagedata.dat”) } val imageTmp = decodeImage2(dataResource.await(), imageResource.await()) val imageResult = dewrapAndCleanupImage2(imageTmp) return imageResult } TVTQFOEͳؔ਺ͦͷ··ΛBTZODͰ͘ΔΜͰ%FGFSSFEʹ %FGFSSFEͳͷͰBXBJU Ͱ͖ΔΑ͏ʹͳͬͨ ࣮ࡍ͸ٯʹɺ%FGFSSFEϝιουΛTVTQFOEͳϝιουͰ Ͱ͘ΔΉ΄͏͕සൟʹ͔ͭ͏ͩΖ͏ͱ͸ࢥ͍·͢ɻ

Slide 30

Slide 30 text

Swift 5ͷasync/await΋FutureΛ࢖͑͹ ෳ਺ॲཧͷ଴ͪ߹Θ͕ͤͰ͖Δ func loadWebResource(_ path: String) async -> Resource func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image func dewarpAndCleanupImage(_ i : Image) async -> Image func processImageData1() async -> Image { let dataResource = Future { loadWebResource(“dataprofile.txt") } let imageResource = Future { loadWebResource(“imagedata.dat”) } let imageTmp = await decodeImage(dataResource.get(), imageResource.get()) let imageResult = await dewrapAndCleanupImage(imageTmp) return imageResult }

Slide 31

Slide 31 text

Swift 5ͷasync/await΋FutureΛ࢖͑͹ ෳ਺ॲཧͷ଴ͪ߹Θ͕ͤͰ͖Δ func loadWebResource(_ path: String) async -> Resource func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image func dewarpAndCleanupImage(_ i : Image) async -> Image func processImageData1() async -> Image { let dataResource = Future { loadWebResource(“dataprofile.txt") } let imageResource = Future { loadWebResource(“imagedata.dat”) } let imageTmp = await decodeImage(dataResource.get(), imageResource.get()) let imageResult = await dewrapAndCleanupImage(imageTmp) return imageResult } ࣗલͷ'VUVSFͰ͘ΔΉ

Slide 32

Slide 32 text

Swift 5ͷasync/await΋FutureΛ࢖͑͹ ෳ਺ॲཧͷ଴ͪ߹Θ͕ͤͰ͖Δ func loadWebResource(_ path: String) async -> Resource func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image func dewarpAndCleanupImage(_ i : Image) async -> Image func processImageData1() async -> Image { let dataResource = Future { loadWebResource(“dataprofile.txt") } let imageResource = Future { loadWebResource(“imagedata.dat”) } let imageTmp = await decodeImage(dataResource.get(), imageResource.get()) let imageResult = await dewrapAndCleanupImage(imageTmp) return imageResult } ࣗલͷ'VUVSFͰ͘ΔΉ GVUVSFHFUϝιουͰ݁ՌΛ଴ͭ

Slide 33

Slide 33 text

Swift 5ͷasync/await΋FutureΛ࢖͑͹ ෳ਺ॲཧͷ଴ͪ߹Θ͕ͤͰ͖Δ func loadWebResource(_ path: String) async -> Resource func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image func dewarpAndCleanupImage(_ i : Image) async -> Image func processImageData1() async -> Image { let dataResource = Future { loadWebResource(“dataprofile.txt") } let imageResource = Future { loadWebResource(“imagedata.dat”) } let imageTmp = await decodeImage(dataResource.get(), imageResource.get()) let imageResult = await dewrapAndCleanupImage(imageTmp) return imageResult } ࣗલͷ'VUVSFͰ͘ΔΉ GVUVSFHFUϝιουͰ݁ՌΛ଴ͭ ͭ·Γ,PUMJOͷTVTQFOEʹ͍ۙײ৮

Slide 34

Slide 34 text

͞Βʹ஌Γ͍ͨਓͷͨΊʹ

Slide 35

Slide 35 text

Swift 5 async/await ݚڀಡຊ • ϥΠϒϥϦHydraͰSwift 4Ͱ΋async/awaitΛ࣮ݱ͢Δ • Hydra͕ͲͷΑ͏ʹͯ͠εϨουΛࢭΊ͍ͯΔ͔ղઆ • async/await ϓϩϙʔβϧυϥϑτͷղઆ • JS, C#, Dart, KotlinͰͷasync/awaitղઆ IUUQTCPPUIQNKBJUFNT