Swift 3.0 の新しい機能(のうちの9つ)

110 Views

June 12, 16

スライド概要

カジュアル Swift 勉強会 #9 で話したスライドです。勉強会中では 3 つまで紹介してたっぷり楽しみましたけど、そんな資料にも続きがあるので、せっかくなのでアップしておきますね。

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 3,832 でした。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

4XJGU ͷ৽‫ػ‬ೳ ͱΓ͋͑ͣ‫ͳʹؾ‬Δͱ͜Ζ͔Β  ΧδϡΞϧ4XJGUษ‫ڧ‬ձ &;/&5‫۽‬୩༑޺ 4XJGUEFW-0$"- IUUQF[OFUKQ

2.

‫۽‬୩༑޺ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ ษ‫ڧ‬ձ ԣ඿J1IPOF։ൃऀษ‫ڧ‬ձ ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ZJEFW ˏԣ඿ɾഅंಓ DTXJGU !ԣ඿ɾ੨༿୆ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕໨తͷձ ΏΔ͘ΈΜͳͰ4XJGUʹ͍ͭͯ ‫ޠ‬Β͑Δ৔͕ཉͯ࢝͘͠Ίͨձ ୈ̎̐ճΛʹ։࠵༧ఆ ୈ̍̌ճ͸݄‫ޙ‬൒͔΋ʁ

3.

‫۽‬୩༑޺ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ ॻ੶ొஃ 9DPEFపఈղઆ .04" 9DPEFͷશ‫ػ‬ೳΛ పఈతʹղઆͨ͠ຊ 049J04‫ܥ‬ͷྺ࢙ਂ͍ ༗ྉձһ੍ͷษ‫ڧ‬ձ 9DPEFͰ΋໾ཱͭ͸ͣ ๏ਓձһ΋ଟ਺ 紙版は絶版、電⼦書籍は販売中

4.

‫۽‬୩༑޺ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ J04 049 "QQMF8BUDIΞϓϦ $PEF1JFDF ͍ͭ΋ͷి୎ ιʔείʔυΛ5XJUUFSͱ (JTUʹಉ࣌౤ߘͰ͖Δɻ ‫ࣜࢉܭ‬΋‫͑ݟ‬Δి୎ΞϓϦɻ XBUDI04ରԠ ԻͰ࠶഑ୡΰου &;/&5*11IPOF ؆୯ૢ࡞Ͱ ࠶഑ୡͷਃ͠ࠐΈɻ J1IPOFͰͻ͔Γి࿩Λ࢖͏ɻ ࣗ୐-"/͔Βͷར༻ઐ༻

5.

$PEF1JFDFGPS04 9 ษ‫ڧ‬ձΛָ͠ΉΞϓϦ ιʔείʔυΛ5XJUUFSͱ(JTUʹಉ࣌౤ߘͰ͖Δ ษ‫ڧ‬ձͰ஌‫ݟ‬ΛΈΜͳͱ‫ڞ‬༗͍ͨ࣌͠ͱ͔ʹศརʂ Ͱ͖Δ͜ͱ #cswift

6.

4XJGU XJMMCFSFMFBTFETPNFUJNFJOMBUF

7.

88%$ ʙ

8.

88%$ Ͱ‫ͳʹؾ‬Δηογϣϯ 8IBU`T/FXJO4XJGU

9.

0QFO4PVSDFʹ͸ͳ͍ Ӆ͠‫͕ۄ‬དྷΔ͔΋ʁ

10.

4XJGUΛ ༧श͓͔ͯ͠Ͷ͹ͳΒͳ͍

11.

લճ 4XJGU  Λ༧श։࢝ 4& IUUQXXXTMJEFTIBSFOFUUPNPIJSPLVNBHBJTXJGUDTXJGU

12.

ͦͯ͠ɺࠓճ͸

13.

4XJGU  ͷ৽‫ػ‬ೳ ͦͷ͏ͪͷ͍͔ͭ͘ΛோΊͯΈΔ

14.

͏Θͬʜ4XJGUͷมߋɺଟ͗͢ʜʁ

15.

4XJGU  ͷ৽‫ػ‬ೳ ຊ೔ͷࢿྉ֓ཁ  ‫׬‬શ໢ཏ͸ͻͱ·ͣఘΊΔʜ  ७ਮ4XJGUΛத৺ʹϐοΫΞοϓ  ͦΕͰ΋ɺ͢΂ͯ͸‫ޠ‬Γ͖Εͳ͍  0CKFDUJWF$Λҙࣝͨ͠‫ػ‬ೳ͸‫ޙ‬೔  ·͔͞ͷௐ΂͖Εͳ͍ͱ͔ແ೦͗͢Δ

16.

ॻࣜͷ‫ݟ‬௚͠

17.

4& ଐੑҾ਺ͷ&RVBMΛ$PMPOʹมߋ

18.

ଐੑҾ਺ͷ&RVBMΛ$PMPOʹมߋ ֓ཁ ⾣ ଐੑҾ਺ͷ஋Λ:Ͱද‫͢ݱ‬Δ ⾣ ୅ೖͱ͸ҧ͏Ͱ͠ΐ͏ʁͱ͍͏Ձ஋‫؍‬ @available(*, unavailable, renamed: "NewProtocol") typealias PreviousProtocol = NewProtocol 4XJGU

19.

༨ஊ !TXJGU@NJHSBUJPOଐੑ

20.

!TXJGU@NJHSBUJPOଐੑʁ ֓ཁ ⾣ ϚΠάϨʔγϣϯͷͨΊͷ৘ใΛ‫͖Ͱࡌه‬Δʁ ⾣ %FWFMPQFS1SFWJFXͰ͸ࢼͤͳ͍

21.

!TXJGU@NJHSBUJPOଐੑʁ ‫ج‬ຊ‫ػ‬ೳ ⾣ !TXJGU@NJDSBUJPOΛ‫ܕ‬΍ؔ਺ͳͲʹࢦఆ ⾣ Ҿ਺ͱͯ͠renamed΍messageΛࢦఆՄೳ @swift3_migration(message: "MESSAGE") func doSomething() { … } @swift3_migration(renamed: "NewProtocol") typealias PreviousProtocol = NewProtocol 4XJGU

22.

4&ଐੑҾ਺ͷ&RVBMΛ$PMPOʹมߋ ‫ײ‬૝ ม͑Δ΄Ͳͷ΋ͷͰ΋ͳ͍Α͏ͳҹ৅ ͦΕΑΓ!TXJGU@NJHSBUJPOʹࠦΒΕΔ

23.

4& ԋࢉࢠηΫγϣϯͰͷίϝϯτͷѻ͍มߋ

24.

ԋࢉࢠηΫγϣϯͰͷίϝϯτͷѻ͍มߋ ֓ཁ ⾣ ίϝϯτͷҐஔͰԋࢉࢠͷղऍ͕มΘ͍ͬͯͨ ⾣ ίϝϯτΛۭനจࣈʹͯ͠ɺ௚‫ײ‬తͳղऍʹ if /* comment */!isValid { ... } !͕ɺ྆ଆΛѻ͏தஔԋࢉࢠͱͯ͠ѻΘΕ͍ͯͨΒ͍͠ value +/* comment */coefficient +/*͕ɺ྆ଆΛѻ͏தஔԋࢉࢠͱͯ͠ѻΘΕ͍ͯͨΒ͍͠ 4XJGUY

25.

ԋࢉࢠηΫγϣϯͰͷίϝϯτͷѻ͍มߋ ղऍͯ͠΋Β͑ͳ͘ͳΔॻࣜ ⾣ ৽ͨʹ4XJGUͰղऍͰ͖ͳ͘ͳΔͷ͕͋Δ ⾣ ίϝϯτ͕ۭനจࣈѻ͍ʹͳΔͷ͕Ө‫ڹ‬ optionalArray/* Comment */?.count ?͕༧‫͍ͳ͠ظ‬จࣈͱͯ͠ೝࣝ͞ΕΔΑ͏ʹͳΔ value+/* comment */coefficient +͕ɺ‫ޙ‬ஔԋࢉࢠͱͯ͠ѻΘΕΔΑ͏ʹͳΔ 4XJGU

26.

4&ԋࢉࢠηΫγϣϯͰͷίϝϯτͷѻ͍มߋ ‫ײ‬૝ ୈҰҹ৅͸ྑ͍͕ɺޭΛ૗͔͢͸ෆ໌ ΋͸΍झຯͷྖҬͳΑ͏ͳ

27.

4& *NQMJDJUMZ6OXSBQQFE0QUJPOBMͷഇࢭ

28.

*NQMJDJUMZ6OXSBQQFE0QUJPOBMͷഇࢭ ֓ཁ ⾣ *NQMJDJUMZ6OXSBQQFE0QUJPOBM‫ܕ‬ͷഇࢭ΁ ⾣ ҉໧ΞϯϥοϓΛࣔ͢!͸ଐੑͱͯ͠ѻ͏ ਜҮᢅәӥӦᒇᦸӓҴӴ let optionalValue: Int! = 100 4XJGU

29.

*NQMJDJUMZ6OXSBQQFE0QUJPOBMͷഇࢭ ࣮ࡍʹ࢖ͬͯΈΔ ⾣ *NQMJDJUMZ6OXSBQQFE0QUJPOBMͱͯ͠ೝࣝ ⾣ ‫ج‬ຊతͳ࢖͍ํ͸ಉ͡ var a: Int! var b: Int? // なぜか ImplicitlyUnwrappedOptional<Int> として認識 print(a.dynamicType) // こちらは Optional<Int> 型として認識 print(b.dynamicType) 4XJGU

30.

4&*NQMJDJUMZ6OXSBQQFE0QUJPOBMͷഇࢭ ‫ײ‬૝ ෆࢥٞʹࢥ͑ͨ‫ڍ‬ಈ΋࣮ʹྑ͍࢓্͕Γ ࣮ࡍʹΈΜͳͱࢼͯ͠༡ΜͰΈͨΒ͍Ζ͍Ζ෼͔ͬͨʂ

31.

4& Ҿ਺ϥϕϧ໊ͷ‫ن‬ଇΛ౷Ұ

32.

Ҿ਺ϥϕϧ໊ͷ‫ن‬ଇΛ౷Ұ ֓ཁ ⾣ ୈ̍Ҿ਺ͷಛྫΛഇࢭɺશͯͰಉ͡‫ن‬ଇʹ ⾣ ΨΠυϥΠϯͷϝιου໋໊‫ن‬ଇ͕ಈ‫ػ‬ func function(first: Int, second: Int, third: Int) { } ◌㮫ᐠᡔҶᢡᇰӑ⍋∪ҿӶӔҹӔӍӉ function(first: 1, second: 10, third: 3) ؔ਺ɺϝιουɺΠχγϟϥΠβʔͷ શͯͷҾ਺ϥϕϧ͕ಉ͡ϧʔϧʹ౷Ұ 4XJGU

33.

Ҿ਺ϥϕϧ໊ͷ‫ن‬ଇΛ౷Ұ ୈ̍Ҿ਺ͷϥϕϧ໊͸มߋՄೳ ⾣ ֎෦Ҿ਺໊Λఴ͑Ε͹มߋՄೳ ⾣ ‫Ͱ_߸ه‬Ҿ਺ϥϕϧΛলུՄೳ // ラベル名を label にする func function(label value: Int) { } ◌㮫ᐠᡔӘՑՁՓൻӼ⍋∪Ӄӵ func function(_ label value: Int) { } 4XJGU

34.

4&Ҿ਺ϥϕϧ໊ͷ‫ن‬ଇΛ౷Ұ ‫ײ‬૝ ۠ผ͢Δඞཁ͕ͳ͘ͳͬͯ‫͍͠خ‬ ΨΠυϥΠϯ९कʹ΋ߩ‫͏ͦ͠ݙ‬

35.

4& !OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ

36.

!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ ֓ཁ ⾣ ม਺ଐੑ͔Β‫ܕ‬ଐੑ΁มߋ ⾣ ‫ܕ‬ͷੑ࣭Λత֬ʹઆ໌Ͱ͖ΔΑ͏ʹ͢Δ func function(@noescape f: () -> Int) { } XBSOJOH!OPFTDBQFJTOPXBOBUUSJCVUFPOBQBSBNFUFSUZQF  JOTUFBEPGPOUIFQBSBNFUFSJUTFMG func function(@autoclosure f: () -> Int) { } 4XJGUY

37.

!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ ৽͍͠ॻࣜ ⾣ ‫!ʹܕ‬OPFTDBQF΍!BVUPDMPTVSFΛఴ͑Δ ⾣ !OPFTDBQFͳΫϩʔδϟʔΈ͍ͨʹಡΊΔ func function(f: @noescape () -> Int) { } func function(f: @autoclosure () -> Int) { } 4XJGU

38.

!OPFTDBQF

39.

‫ʹܕ‬ରͯ͠!OPFTDBQFΛఆٛ ߴ֊ؔ਺ͰҖྗΛൃ‫ش‬ ⾣ !OPFTDBQFͳؔ਺‫ܕ‬ΛฦͤΔ ⾣ ෆඞཁʹΤεέʔϓ͢Δඞཁ͕ͳ͘ͳΔ func function(f: () -> Int) -> (@noescape (Int) -> Int) -> Int { return { g in g(f()) } } 4XJGU

40.

‫ʹܕ‬ରͯ͠!OPFTDBQFΛఆٛ ϩʔΧϧม਺ͷؔ਺‫Ͱܕ‬΋࢖͑Δ ⾣ !OPFTDBQFͳΫϩʔδϟʔΛ࡞ΕΔ ⾣ είʔϓ಺Ͱ࢖͍ऴΘΔΫϩʔδϟʔʹ࠷ద func method() -> Int { let g: @noescape (Int) -> Int = { $0 + action() * 2 } return function(g) } ͨͩ͠!FTDBQFͳؔ਺‫ܕ‬Λ औΔؔ਺ʹ͸౉ͤͳ͍ͷͰ஫ҙ 4XJGU

41.

‫ʹܕ‬ରͯ͠!OPFTDBQFΛఆٛ ैલͷTFMGΛলུ͢Δํ๏ ⾣ Ҏલ΋ؔ਺ΛೖΕࢠʹͯ͠TFMGΛলུՄೳ ⾣ Τεέʔϓͳؔ਺‫ͤ౉ͯ͠ͱܕ‬Δ func method() -> Int { func g(_ value: Int) -> Int { return value + action() * 2 } return function(g) } ͜ͷ৔߹͸!FTDBQFͳؔ਺‫ܕ‬Λ औΔؔ਺ʹ΋౉ͤΔ 4XJGU

42.

‫ʹܕ‬ରͯ͠!OPFTDBQFΛఆٛ !OPFTDBQFΛ!OPFTDBQFͰแΜͰฦͤͳ͍ʁ ⾣ ໭Γ஋ͷؔ਺‫!͕ܕ‬OPFTDBQFͰ͸ͳ͍ ⾣ !FTDBQFͳؔ਺‫ܕ‬͸!OPFTDBQFΛ࣋ͯͳ͍ func function(@noescape f: () -> Int) -> (@noescape (Int) -> Int) -> Int { return { g in g(f()) } } FSSPSDMPTVSFVTFPG!OPFTDBQFQBSBNFUFSGNBZ BMMPXJUUPFTDBQF 4XJGU

43.

‫ʹܕ‬ରͯ͠!OPFTDBQFΛఆٛ ໭Γ஋ͷؔ਺‫ࣗܕ‬ମΛ!OPFTDBQFʹͰ͖Δ ⾣ ໭Γ஋ͷؔ਺‫!ʹܕ‬OPFTDBQFΛࢦఆ͢Δ ⾣ !OPFTDBQFΛ࣋ͯΔΑ͏ʹͳΔ func function(@noescape f: () -> Int) -> @noescape (@noescape (Int) -> Int) -> Int { return { g in g(f()) } } 4XJGU

44.

!BVUPDMPTVSF

45.

‫ʹܕ‬ରͯ͠!BVUPDMPTVSFΛఆٛ ߴ֊ؔ਺ͰҖྗΛൃ‫ش‬ ⾣ !BVUPDMPTVSFͳؔ਺‫ܕ‬ΛฦͤΔ ⾣ ‫ͼݺ‬ग़͠ઌͰͷར༻ΛγϯϓϧʹͰ͖Δ func function() -> (@autoclosure () -> Int) -> Int { return { (f: @autoclosure () -> Int) in f() } } ‫Ͱ఺࣌ݱ‬͸࠷௿‫ݶ‬ɺҾ਺Ϧετͷఆ͕ٛඞཁͳ༷ࢠ // 関数で得た、関数を取る関数に、値をそのまま渡せる let f = function() let result = f(100) 4XJGU

46.

‫ʹܕ‬ରͯ͠!BVUPDMPTVSFΛఆٛ ؔ਺‫ܕ‬ͷม਺Ͱ΋࢖͑Δ ⾣ !BVUPDMPTVSFΛҾ਺ʹऔΔؔ਺‫ܕ‬Λ࡞ΕΔ ⾣ ‫ͼݺ‬ग़͠ઌͰͷར༻ΛγϯϓϧʹͰ͖Δ let f: () -> (@autoclosure () -> Int) -> Int = { return { (f: @autoclosure () -> Int) in f() } } // 関数を取る関数に、値をそのまま渡せる let result = f(100) 4XJGU

47.

‫ʹܕ‬ରͯ͠!BVUPDMPTVSFΛఆٛ ม਺Λ!BVUPDMPTVSF‫ʹܕ‬͸Ͱ͖ͳ͍ ⾣ !BVUPDMPTVSFͳؔ਺‫ܕ‬ͷม਺͸࡞Εͳ͍ ⾣ ࡞ΕͨΒָͦ͠͏ͩͬͨͷʹ let value: @autoclosure () -> Int = { return 100 } FSSPS!BVUPDMPTVSFNBZPOMZCFVTFEPOQBSBNFUFST 4XJGU

48.

4&!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ ‫ײ‬૝ Ϋϩʔδϟʔ͕ૉ੖Β͘͠ਐԽͨ͠ҹ৅ !OPFTDBQFΫϩʔδϟʔ͕ಛʹ޷Έʂ

49.

4& ‫ʹܕ‬ରͯ͠JOPVUΛఆٛ

50.

‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ֓ཁ ⾣ ϥϕϧʹఴ͍͑ͯͨJOPVUΛ‫΁ܕ‬ ⾣ ϥϕϧͱJOPVU͕۠ผ͠ʹ͍ͨ͘Ί func method(inout result: Int) { } FSSPSJOPVUCFGPSFBQBSBNFUFSOBNFJTOPUBMMPXFE QMBDFJUCFGPSFUIFQBSBNFUFSUZQFJOTUFBE ՑՁՓҶ⋭࿾ӃӵӘӒൺӂ࿾ᙟ func method(inOut result: Int) { } 4XJGUY

51.

‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ৽͍͠ॻࣜ ⾣ ‫ʹܕ‬ఴ͑Δ͜ͱͰϥϕϧͱ໌֬ʹ۠ผՄೳ ⾣ Ͱ΋JOPVU‫Ͱܕ‬͸ແ͍Α͏ͳ‫ؾ‬͸͢Δʁ func method(result: inout Int) { } ஗㋚ႁᡔൻӘፗҶՑՁՓൻӑҬӵҽӒҶᣀ⎰ func method(inOut result: inout Int) { } 4XJGU

52.

‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ϥϕϧ໊ʹJOPVU͸ͦͷ··࢖͑ͳ͍ ⾣ JOPVU͸ϥϕϧ໊ͷՕॴͰ΋༧໿‫ޠ‬ ⾣ ϥϕϧ໊ʹ࢖͍͍ͨͳΒΤεέʔϓ͕ඞཁ func method(inout result: inout Int) { } FSSPSJOPVUCFGPSFBQBSBNFUFSOBNFJTOPUBMMPXFE QMBDFJUCFGPSFUIFQBSBNFUFSUZQFJOTUFBE ԐԡԙդԿӃӶӚਜҲӵѭහӝ௲ӁᣪӬԐԡԙդԿҶᒨ⺙ func method(`inout` result: inout Int) { } 4XJGU

53.

‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ৽͍͠ॻࣜ ⾣ ‫ʹܕ‬ఴ͑Δ͜ͱͰϥϕϧͱ໌֬ʹ۠ผՄೳ ⾣ Ͱ΋JOPVU‫Ͱܕ‬͸ແ͍Α͏ͳ‫ؾ‬͸͢Δʁ func method(result: inout Int) { } ஗㋚ႁᡔൻӘፗҶՑՁՓൻӑҬӵҽӒҶᣀ⎰ func method(inOut result: inout Int) { } 4XJGU

54.

‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ߴ֊ؔ਺ͰҖྗΛൃ‫ش‬ ⾣ JOPVUͳؔ਺‫ܕ‬ΛฦͤΔ ⾣ ͪΌΜͱJOPVUͱͯ͠‫ػ‬ೳ͢Δ func function() -> (result: inout Int) -> Void { return { (result: inout Int) -> Void in result = 700 } } 4XJGU

55.

‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ‫ܕ‬ਪ࿦΋ಇ͘ ⾣ ҉໧ఆٛ͞ΕΔม਺ͰJOPVUՄೳ ⾣ ‫׳‬Εͳ͍͔Β͔ɺίʔυΛோΊ͍ͯΔͱෆ҆ func function() -> (result: inout Int) -> Void { return { $0 = 700 } } 4XJGU

56.

‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ؔ਺‫ܕ‬ͷม਺Ͱ΋࢖͑Δ ⾣ ؔ਺‫ܕ‬ͷม਺Ͱ΋JOPVU͕Մೳ ⾣ ࢖͍ํ͸ීஈͷͱ͓Γ let f: (inout Int) -> Void = { return { $0 = 5000 } } 4XJGU

57.

4&‫ʹܕ‬ରͯ͠JOPVUΛఆٛ ‫ײ‬૝ Ϋϩʔδϟʔͱಉ͘͡Մೳੑ͕޿͕Δҹ৅ ͦ΋ͦ΋JOPVU͸໾ཱͭͷ͔͠Β

58.

‫ػ‬ೳͷ࡟আ

59.

4& ΧϦʔԽؔ਺ߏจͷ࡟আ

60.

ΧϦʔԽؔ਺ߏจͷ࡟আ ֓ཁ ⾣ ΧϦʔԽߏจΛ࡟আ͢Δ ⾣ ͦ΋ͦ΋େͯ͠໾ʹཱͨͳ͍Ͱ͠ΐ͏ʁ func freeFall(context: Context)(time: Double) -> Double { return -1 / 2 * time * time * context.gravitationalAcceleration } FSSPSDVSSJFEGVODUJPOEFDMBSBUJPOTZOUBYIBTCFFOSFNPWFE VTFBTJOHMFQBSBNFUFSMJTU 4XJGUY

61.

ΧϦʔԽؔ਺ߏจͷ࡟আ ߴ֊ؔ਺Λ࢖͏ํ๏ʹҰຊԽ ⾣ ‫༷࢓ޠݴ‬ͷෳࡶ͞Λੋਖ਼ ⾣ ಈ࡞͸ΧϦʔԽߏจͱ·ͬͨ͘ಉ͡ func freeFall(context: Context) -> (time: Double) -> Double { return { time in -1 / 2 * time * time * context.gravitationalAcceleration } } 4XJGU

62.

ΧϦʔԽؔ਺ߏจͷ࡟আ ΧϦʔԽؔ਺ͷ࢖༻ྫ // コンテキストを固定し、その環境を前提に動く関数を定義 let earth = Context(identifier: "Earth", gravitationalAcceleration: 9.80665) let freeFallOnEarth: (time: Double) -> Double = freeFall(context: earth) // 汎用関数でスマートに捌く let timeInterval = stride(from: 0.0, through: 100.0, by: 1.0) let locations = timeInterval.map(freeFallOnEarth) 4XJGU

63.

ΧϦʔԽؔ਺ߏจͷ࡟আ YΧϦʔԽߏจͷཹҙ఺ ⾣ ॊೈͳείʔϓ੍‫ޚ‬Λߦ͑ͳ͍ ⾣ ࠷‫Ͱ·ޙ‬Πϯελϯε͕อ࣋͞ΕΔ func function(object: Object)(multiple: Int) -> Int { let value = object.value return value * multiple } do { let f = function(Object(100)) print(f(multiple: 5)) είʔϓऴྃ·Ͱ 0CKFDUอ࣋ } 4XJGUY

64.

ΧϦʔԽؔ਺ߏจͷ࡟আ ߴ֊ؔ਺Ͱ͸ࣗ෼Ͱ੍‫ޚ‬Մೳ ⾣ ҙࣝతͳείʔϓ੍‫͕ޚ‬Մೳ ⾣ ฦؔ͢਺ʹ‫͚ͳ·ؚ‬Ε͹อ࣋͞Εͳ͍ func function(object:Object) -> (multiple:Int) -> Int { let value = object.value return { multiple in value * multiple } } ؔ਺Λฦͨ࣌͠఺Ͱ 0CKFDU͕ϑϦʔʹͳΔ do { let f = function(Object(100)) print(f(multiple: 5)) } 4XJGU

65.

4&ΧϦʔԽؔ਺ߏจͷ࡟আ ‫ײ‬૝ ैདྷ௨Γͷߴ֊ؔ਺Ͱ୅ସՄೳ ΫϩʔδϟʔͷਐԽͱ૬·ͬͯૉ੖Β͍͠

66.

4& 4& Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ

67.
[beta]
Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ
֓ཁ
⾣ ߏจͷՁ஋ͷׂʹࠞཚ͢Δ͔Β࡟আ
⾣ JOPVUͱWBSͷҙຯΛࠞಉ͠΍͍͢ʁ

func function(var initial value: Int, count: Int) -> Int {
FSSPSQBSBNFUFSTNBZOPUIBWFUIFWBSTQFDJpFS

(1 ..< count).forEach { _ in
value += value
}
return value
}

4XJGUY

68.
[beta]
Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ
WBSͷಈ͖Λ͓͞Β͍
Մม஋ม਺WBS͕࡞ΒΕɺෳ੡ͨ͠஋Λอ࣋

func function(var initial value: Int, count: Int) -> Int {
(1 ..< count).forEach { _ in
value += value
}

Մม஋ม਺ͳͷͰॻ͖‫͑׵‬Մೳ

return value
}

‫ͼݺ‬ग़͠ઌͷWBSม਺͕ॻ͖‫͑׵‬ΒΕͯ΋
‫ݩ‬ͷม਺WBMVF͸Ө‫ڹ‬Λड͚ͳ͍

var value = 10
let answer = function(initial: value, count: 5)
ͦ΋ͦ΋ॻ͖‫͍ͳ͑׵‬ͷͰMFUͰྑ͍

4XJGUY

69.

Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ JOPVUͷಈ͖Λ͓͞Β͍ Մม஋ม਺WBS͕࡞ΒΕɺෳ੡ͨ͠஋Λอ࣋ func function(initial value: inout Int, count: Int) { (1 ..< count).forEach { _ in value += value } } Մม஋ม਺ͳͷͰɺม਺ࣗମ͕ॻ͖‫͑׵‬Մೳ είʔϓΛൈ͚ΔͱɺՄม஋ม਺Λ‫ݩ‬ͷม਺ʹॻ͖໭͢ JOPVUʹ౉͢ม਺͸ɺॻ͖ม͑ʢॻ͖໭͠ʣΛ൐͏ͷͰWBSͰએ‫ݴ‬ var value = 10 ‫ͼݺ‬ग़࣌͠͸lzΛ໌‫͢౉ͯ͠ه‬ʢࢀর౉͠Ͱ͸ͳ͍ʣ function(initial: &value, count: 5) 4XJGU

70.
[beta]
Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ
Ҿ਺ϦετͰWBS͕࢖͍͑ͯͨࠒͷར఺
⾣ ౉͞Εͨ஋Λ‫ʹݩ‬ଈ࠲ʹฤूͰ͖Δ
⾣ ม਺WBSʹ࠶୅ೖ͢Δख͕ؒল͚Δ

func function(var initial value: Int, count: Int) -> Int {
// 即座に value に変更を仕掛けていける

(1 ..< count).forEach { _ in
value += value
}
return value
}
4XJGUY

71.
[beta]
Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ
Ҿ਺ϦετͰWBS͕࢖͑ͳ͘ͳͬͨ৔߹
⾣ ౉͞Εͨ஋ΛWBSͰड͚௚͢
⾣ ͋ͱ͸ࠓ·Ͱ௨ΓͷॲཧͰ0,

func function(initial value: Int, count: Int) -> Int {
// 編集できるように新しい可変値変数で受け直す

var value = value
(1 ..< count).forEach { _ in
value += value
}
return value
}

4XJGU

72.
[beta]
Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ
ͦ΋ͦ΋WBSΛ࢖Θͳ͍खΛ୳͠·ͤΜ͔ʁ
⾣ ஋ͷ‫ʹࢉܭ‬WBSΛ࣋ͪग़͞ͳ͍εεϝ
⾣ ༡ΜͰΈΔͱ4XJGUΒ͕͠͞‫ͯ͑͘ݟ‬Δʁ

func function(initial value: Int, count: Int) -> Int {
return (1 ..< count).reduce(value) { value, _ in
value + value
}
}

4XJGU

73.
[beta]
Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ
Ҿ਺ϦετͰͷMFU໌ࣔࢦఆ΋࡟আ
⾣ Ҿ਺ϦετͰWBS͕ͳ͍ͳΒMFU໌ࣔ΋ෆཁ
⾣ ‫ͯ͑׶‬MFUΛॻ͘‫ػ‬ձ͸ͳ͔ͬͨ͸ͣ

func function(let initial value: Int, count: Int) -> Int {
FSSPSMFUBTBQBSBNFUFSBUUSJCVUFJTOPUBMMPXFE

return (1 ..< count).reduce(value) { value, _ in
value + value
}
}
4XJGU

74.

Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ Ҿ਺ϦετҎ֎ͳΒWBSͰड͚ΒΕΔ // if var 構文で使用可能 if var value = optionalValue { … } // while 構文で使用可能 while var value = iterator.next() { … } // for 構文で使用可能 for var value in values { … } // switch 構文で使用可能 switch optionalValue { case .some(var value): … case .none: … } 4XJGU

75.

Ҿ਺Ϧετ͔ΒWBSͱMFUΛ࡟আ HVBSEͰ΋WBSͰड͚ΒΕΔ ⾣ HVBSEͭͭ͠WBSม਺ΛఆٛͰ͖Δ ⾣ ൺֱతεϚʔτ͔΋ʁʢΦεεϝ͸͠ͳ͍ʣ // guard var 構文が使用可能 guard var value = optionalValue else { fatalError() } // これ以降で可変値変数 value が使える value += 200 4XJGU

76.

ͻͱ·ͣɺ͜͜·Ͱ

77.

4XJGU ͷ৽‫ػ‬ೳ ͻͱ·ͣɺ͓͠·͍  4&ଐੑҾ਺ͷ&RVBMΛ$PMPOʹมߋ  4&ԋࢉࢠηΫγϣϯͰͷίϝϯτͷѻ͍  4&*NQMJDJUMZ6OXSBQQFE0QUJPOBMͷഇࢭ  4&Ҿ਺ϥϕϧ໊ͷ‫ن‬ଇΛ౷Ұ  4&!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ  4&‫ʹܕ‬ରͯ͠JOPVUΛఆٛ  4&ΧϦʔԽߏจͷ࡟আ  4&Ҿ਺Ϧετ͔ΒWBSΛ࡟আ  4&Ҿ਺Ϧετ͔ΒMFUΛ࡟আ