Swift 3.0 で変わったところ - 厳選 13 項目 #love_swift #cswift

138 Views

August 01, 16

スライド概要

Swift 3.0 で変わったところから、興味の湧いた 13 項目を、自分が開催する "カジュアル Swift 勉強会" の紹介も兼ねつつ、Swift 愛好会で発表してきました。

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


少し前に iPhone Dev Sapporo 勉強会で話した内容から、項目数は減らしつつも、新たな項目を紹介したり、紹介済みの項目についても内容を少し膨らませたりしています。

profile-image

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

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

4XJGU ͰมΘͬͨͱ͜Ζ ΧδϡΞϧ4XJGUษ‫ڧ‬ձͷΈΜͳ͕ ޷͖ͦ͏ͳ߲໨ʹߜͬͯ঺հʜʂ /*    ू·Ε4XJGU޷͖ʂ4XJGUѪ޷ձWPM */ &;/&5‫۽‬୩༑޺ 4XJGU%FWFMPQFS1SFWJFX 9DPEFCFUB IUUQF[OFUKQ

2.

‫۽‬୩༑޺ /* @es_kumagai */ 5PNPIJSP,VNBHBJ /** */ ⾣ 4XJGU‫͕ޠݴ‬௒େ޷͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษ‫ڧ‬ձ͕େ޷͖Ͱ͢ʂ ⾣ ษ‫ڧ‬ձͰൃද͢Δͷ͕ͱͬͯ΋޷͖Ͱ͢ʂ ⾣ ॻ੶9DPEFపఈղઆॻ͖·ͨ͠ɻ ⾣ ٕज़ϒϩά&;/&5Λॻ͍ͨΓͯ͠·͢ɻ

3.

ษ‫ڧ‬ձΛ։࠵ͯ͠·͢ɻ ԣ඿J1IPOF։ൃऀษ‫ڧ‬ձ ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ZJEFW ˏԣ඿ɾഅंಓ DTXJGU !ԣ඿ɾ੨༿୆ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕໨తͷձ ΏΔ͘ΈΜͳͰ4XJGU‫͍ͯͭʹޠݴ‬ ‫ޠ‬Β͑Δ৔͕ཉͯ࢝͘͠Ίͨձ ୈճ͸݄೔ͷ։࠵Λ໨ඪ ୈճ͸ɺ݄̔Լ०্͔݄̕०Λ໨ඪ

4.

ΧδϡΞϧ4XJGUษ‫ڧ‬ձ DTXJGU !ԣ඿ɾ੨༿୆

5.

ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ໨త  4XJGUʹ͍ͭͯ‫ޠ‬Β͑Δ৔ॴ  ஊস͠ͳ͕ΒֶͼΛਂΊΔ  ͔͔ͤͬͩ͘Βָ͋͘͠Γ͍ͨ

6.

ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ৺ߏ͑  ΈΜͳͷҙ‫͕ݟ‬ਖ਼͍͠  ΈΜͳ஌ͬͯΔɺ͸ࢥ͍ࠐΈ DTXJGU

7.

4XJGU XJMMCFSFMFBTFETPNFUJNFJOMBUF

8.

ͦΖͦΖ4XJGUΛ ೺Ѳ͓͖͍ͯͨ͠ʜʂ

9.

4XJGU֓ཁ

10.

4XJGU τοϓχϡʔε ⾣ ೥ͷ‫ޙ‬൒ʹϦϦʔε ⾣ 4XJGU͔Βͷഁյతͳ࢓༷มߋ

11.

4XJGU ໨ඪ ⾣ 4XJGU‫ޠݴ‬Λ֬ఆɾख़੒ͤ͞Δ ⾣ 4XJGUҎ߱Ͱͷιʔείʔυͷ ‫׵ޓ‬ੑΛ໨ࢦ͢ʢ౒ྗ໨ඪʣ ⾣ 4XJGUҎ߱ͷιʔε‫׵ޓ‬ഁյ͸ ࠷খ‫ݶ‬ͷӨ‫Ͱڹ‬ͷ࣮‫ݱ‬Λ໨ࢦ͢

12.

4XJGU ཁ఺ ⾣ ৽͍͠"1*ΨΠυϥΠϯ ⾣ ‫༷࢓ޠݴ‬Λચ࿅ ⾣ 0CKFDUJWF$΍$ͷίʔυΛ 4XJGUจԽʹ߹Θͤͯऔࠐ ⾣ ίϯύΠϥ΍*%&ͷ඼࣭޲্ ⾣ 4XJGUύοέʔδϚωʔδϟʔ

13.

4XJGU ண஍఺ ‫ޠݴ‬ͷ҆ఆԽΛਤΓ ଞ‫΁ڥ؀‬ͷҠ২ੑΛ‫ݟ‬ਾ͑Δ

14.

4XJGUͰมΘͬͨͱ͜Ζ ଟ͗͢ΔͷͰɺΧδϡΞϧ4XJGUษ‫ڧ‬ձͷΈΜͳ͕ ޷͖ͦ͏ͳ࿩୊ʹߜͬͯ঺հͯ͠ΈΔ

15.

4XJGU ͰมΘͬͨͱ͜Ζ  "1*%FTJHO(VJEFMJOFT  4&4XJGU"1*ΨΠυϥΠϯ  4&໋໊‫ن‬ଇ΁ͷΨΠυϥΠϯͷద༻  4&ඪ४ϥΠϒϥϦ΁ͷద༻  4&'PVOEBUJPO΁ͷద༻ ‫ࢥޠݴ‬૝ʹؔ͢Δมߋ  4&໭Γ஋Λ࢖Θͳ͍ͱ‫ʹࠂܯ‬  4&*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ΁  4&খ਺఺਺ϓϩτίϧ

16.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ࢥޠݴ‬૝ʹؔ͢Δมߋ  4&'PVOEBUJPOͷ஋‫ܕ‬  4&OJMϙΠϯλʔද‫ݱ‬  4&ίϨΫγϣϯͷ࠶ઃ‫ܭ‬  4&ΠςϨʔλʔͰͷOJMอূ  4&#PPMFBO5ZQFϓϩτίϧͷഇࢭ จ๏ʹؔ͢Δมߋ  4&ԋࢉࢠηΫγϣϯͰͷίϝϯτ  4&Ҿ਺Ϧετͷ‫ހׅ‬Λඞਢʹ

17.

4XJGU ͰมΘͬͨͱ͜Ζ  จ๏ʹؔ͢Δมߋ  4&Ҿ਺ϥϕϧ໊ͷ‫ن‬ଇΛ౷Ұ  4&ଐੑҾ਺ͷ&RVBMΛ$PMPOʹมߋ  4&ϝϯόʔࢀরͰ࢖͑Δ༧໿‫ޠ‬  4&ྻ‫Ͱ಺ܕڍ‬ͷྻ‫ࢠڍ‬ද‫ه‬  4&‫ط‬ఆ஋Λ࣋ͭҾ਺ͷॱংΛ‫ݻ‬ఆ ϓϩτίϧද‫ؔ͢ʹه‬Δมߋ  4&QSPUPDPM" #ΛԋࢉࢠͰද‫ݱ‬  4&-JUFSBM$POWFSUJCMFͷ໊শมߋ

18.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ؔ͢ʹܕ‬Δมߋ  4&ԋࢉࢠΛ‫૷࣮͕ܕ‬  4&!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ  4&‫ʹܕ‬ରͯ͠JOPVUΛఆٛ  4&JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍‫ݶ‬  4&6ONBOBHFE͸4XJGUϙΠϯλΛѻ͏ ‫ߏޠݴ‬จͷ࡟আ  4&$ελΠϧGPSϧʔϓͷ࡟আ  4&ԋࢉࢠ ͱͷ࡟আ

19.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ߏޠݴ‬จͷ࡟আ  4&ΧϦʔԽؔ਺ߏจͷ࡟আ  4&Ҿ਺Ϧετ͔ΒWBSΛ࡟আ  4&Ҿ਺Ϧετ͔ΒMFUΛ࡟আ  4&λϓϧεϓϥοτͷഇࢭ จ๏ʹؔ͢Δ‫ػ‬ೳ௥Ճ  4&δΣωϦοΫͳ‫ܕ‬ΤΠϦΞε  4&DBTFͰͷෳ਺ύλʔϯϚον

20.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ؔ͢ʹܕ‬Δ‫ػ‬ೳ௥Ճ  4&γʔέϯε͔ΒཁૉΛ‫͚ͯͭݟ‬औಘ  4&γʔέϯεΛ࡞Δؔ਺  4&0QUJPOBM޲͚GMBU.BQΛ஗ԆՄೳʹ  4&4MJDF͔Β‫ݩ‬ͷγʔέϯεΛࢀর ࣮ߦ‫ؔ͢ʹڥ؀‬Δมߋ  4&σόοάࣝผࢠͷϞμϯԽ  4&MJOFࣝผࢠͷᐆດੑΛղফ  4&1MBZHSPVOEϦςϥϧͷϞμϯԽ

21.

‫ࢥޠݴ‬૝ʹؔ͢Δมߋ

22.

໭Γ஋Λ࢖Θͳ͍ͱ‫ʹࠂܯ‬ 4&

23.

໭Γ஋Λ࢖Θͳ͍ͱ‫ʹࠂܯ‬ Ҏલ͸ɺ໭Γ஋Λ࢖Θͳͯ͘΋‫͠ͳࠂܯ‬ ⾣ 4XJGU͸ɺ ؔ਺ͷ݁ՌΛड͚औΒͳͯ͘΋‫͞ࠂܯ‬Εͳ͍ ⾣ ‫ͳ͍ͨ͠ࠂܯ‬Β!XBSO@VOVTFE@SFTVMUΛ෇༩ class Item { // 戻り値を使わないと警告される @warn_unused_result func makeFilter() -> Filter {…} // 戻り値を使わなくても警告されない func apply(filter: Filter) -> Item {…} } 4XJGUY

24.

໭Γ஋Λ࢖Θͳ͍ͱ‫ʹࠂܯ‬ ࠓ‫ޙ‬͸ɺ໭Γ஋Λ࢖Θͳ͍ͱ‫͋ࠂܯ‬Γ ⾣ 4XJGU͸ɺ ؔ਺ͷ݁ՌΛड͚औΒͳ͍ͱ‫͞ࠂܯ‬ΕΔ ⾣ ‫ࠂܯ‬ෆཁͳΒ!EJTDBSEBCMF3FTVMUΛ෇༩ class Item { // 戻り値を使わないと警告される func makeFilter() -> Filter {…} // 戻り値を使わなくても警告されない @discardableResult func apply(filter: Filter) -> Item {…} } 4XJGU1SFWJFX

25.

໭Γ஋Λ࢖Θͳ͍ͱ‫ʹࠂܯ‬ !XBSO@VOVTFE@SFTVMU͸࢖͑ͳ͍ ⾣ !XBSO@VOVTFE@SFTVMU͸࢖͑ͳ͍ ⾣ NVUBCMF@WBSJBOUͱNFTTBHF͸ υΩϡϝϯτίϝϯτͰରԠʢະ࣮૷ʣ /// MutatingCounterpart: xxxx /// MonmutatingCounterpart: xxxx func makeFilter() -> Filter {…} 4XJGU1SFWJFX

26.

4&໭Γ஋Λ࢖Θͳ͍ͱ‫ʹࠂܯ‬ ‫ײ‬૝ ϝιουఆٛͷෛ୲͕͔ͳΓܰ‫͞ݮ‬Εͦ͏ ࡞Δଆ͕Կ΋ߟ͑ͳͯ͘΋ɺ‫ࠂܯ‬ѻ͍ʹͳΔͷ͕ྑ͍ʂ

27.

খ਺఺਺ϓϩτίϧ 4&

28.

খ਺఺਺ϓϩτίϧ ϓϩτίϧઃ‫ܭ‬ͷௐ੔ ⾣ େখൺֱՄೳ ⾣ খ਺఺਺ϦςϥϧʹରԠ ⾣ ৒༨ԋࢉࢠͷഇࢭ ⾣ ‫ج‬ຊతͳఆ਺ͷఏ‫ڙ‬ ⾣ 'MPBU‫'͕ܕ‬MPBUJOH1PJOUʹ४‫ڌ‬

29.

খ਺఺਺ϓϩτίϧ 'MPBUJOH1PJOUϓϩτίϧ ⾣ Ҏલ͸ɺม‫׵‬ΠχγϟϥΠβͱঢ়‫گ‬൑ఆɺ ಛघঢ়ଶʢ㱣 /B/ Λࣔ͢ϓϩύςΟͷΈ ⾣ ஋ੜ੒ɺԋࢉɺఆ਺ͳͲͷ‫ػ‬ೳΛ௥Ճ ߲໨ ༻్ *OUFHFS-JUFSBM$POWFSUJCMF ੔਺ϦςϥϧʹରԠ JOJU TJHOFYQPOFOUTJHOJpDBOE ෆಈখ਺఺Ͱͷॳ‫ظ‬Խ TUBUJDWBSSBEJY ‫਺ج‬ TUBUJDWBSQJ ԁप཰ WBSVNQ ࣍ʹද‫ݱ‬Մೳͳ஋ͱͷࠩ෼ ˞‫͔ͭز‬ൈਮ

30.

খ਺఺਺ϓϩτίϧ #JOBSZ'MPBUJOH1PJOUϓϩτίϧ ⾣ ‫͕̎਺ج‬ͷුಈখ਺఺਺ද‫ݱ‬ ⾣ 'MPBUJOH1PJOUϓϩτίϧΛ‫ܧ‬ঝ ⾣ ϏοτύλʔϯʹΑΔૢ࡞Λ௥Ճ ߲໨ ༻్ 3BX4JHOJpDBOE Ծ਺ද‫͠ͳ߸ූ͏࢖Ͱݱ‬੔਺‫ܕ‬ 3BX&YQPOFOU ࢦ਺ද‫͠ͳ߸ූ͏࢖Ͱݱ‬੔਺‫ܕ‬ TUBUJDWBSTJHOJGJDBOE#JU$PVOU Ծ਺ද‫͑࢖Ͱݱ‬ΔϏοτ਺ WBSTJHOJpDBOE#JU1BUUFSO Ծ਺Λද‫͢ݱ‬ΔϏοτύλʔϯ WBSCJOBEF ‫̎਺ج‬Λࢦ਺෦Ͱྦྷ৐ͨ͠஋ ˞‫͔ͭز‬ൈਮ

31.
[beta]
খ਺఺਺ϓϩτίϧ

ԋࢉʹରԠ
⾣ ϓϩτίϧࣗ਎͕ԋࢉʹରԠ
⾣ ࢛ଇԋࢉɺେখൺֱ

func add<T: FloatingPoint>(lhs: T, rhs: T) -> T {
return lhs + rhs
}
۩ମతͳ‫ܕ‬Λ૝ఆ͠ͳͯ͘΋ԋࢉՄೳʹ

4XJGU1SFWJFX

32.

4&খ਺఺਺ϓϩτίϧ ‫ײ‬૝ ුಈখ਺఺Λ֓೦ͱͯ͠ѻ͑Δͷ͕ྑͦ͞͏ ඪ४ϥΠϒϥϦʹͯ͠͸௝͘͠๲Εͨϓϩτίϧͳҹ৅

33.

'PVOEBUJPOͷ஋‫ܕ‬ 4&

34.

'PVOEBUJPOͷ஋‫ܕ‬ Ҏલͷ'PVOEBUJPOσʔλ‫ܕ‬ ⾣ 'PVOEBUJPOͷσʔλ‫ܕ‬͸ࢀর‫ܕ‬ ⾣ 4XJGUͷՄมੑɾෆมੑͱ૬ੑ͕ѱ͍ enum Item { case binary(NSData) } ՄมੑΛɺએ‫ޚ੍Ͱܕ͘ͳͰݴ‬ let data1: NSMutableData = … let data2: NSData = … ஋‫ܕ‬ͷΠϯελϯεΛੜ੒ let item = Item.binary(data1) data1.appendData(data2) EBUBͷߋ৽͕JUFNʹ΋Ө‫ڹ‬ 4XJGUY

35.

'PVOEBUJPOͷ஋‫ܕ‬ ࠓ‫ޙ‬ͷ'PVOEBUJPOσʔλ‫ܕ‬ ⾣ ैདྷͷࢀর‫ܕ‬Λผͷ஋‫ʹܕ‬ϒϦοδ ⾣ 4XJGUͷՄมੑɾෆมੑͱௐ࿨͢Δ enum Item { case binary(Data) } ՄมੑΛɺએ‫ݴ‬MFU WBSͰ੍‫ޚ‬ var data1: Data = … let data2: Data = … ஋‫ܕ‬ͷΠϯελϯεΛੜ੒ let item = Item.binary(data1) data1.appendData(data2) EBUBͷߋ৽͸JUFNʹӨ‫͠ͳڹ‬ 4XJGU1SFWJFX

36.

'PVOEBUJPOͷ஋‫ܕ‬ ৽͍͠σʔλ‫ܕ‬ ஋‫ܕ‬ ࢀর‫ܕ‬ "⒏OF5SBOTGPSN /4"⒏OF5SBOTGPSN $IBSBDUFS4FU /4$IBSBDUFS4FU /4.VUBCMF$IBSBDUFS4FU %BUF /4%BUF %BUF$PNQPOFOUT /4%BUF$PNQPOFOUT %BUB /4%BUB /4.VUBCMF%BUB *OEFY4FU /4*OEFY4FU /4.VUBCMF*OEFY4FU *OEFY1BUI /4*OEFY1BUI /PUJpDBUJPO /4/PUJpDBUJPO 1FSTPO/BNF$PNQPOFOUT /41FSTPO/BNF$PNQPOFOUT 63- /463- 63-$PNQPOFOUT /463-$PNQPOFOUT 63-2VFSZ*UFN /463-2VFSZ*UFN 66*% /466*%

37.

4&'PVOEBUJPOͷ஋‫ܕ‬ ‫ײ‬૝ ࢀর‫ͱܕ‬஋‫ܕ‬ΛϒϦοδͰӡ༻͢Δͷ͕޷Έ ඪ४ϥΠϒϥϦͰͳ͘'PVOEBUJPOͰఆ͍ٛͯͯ͠‫ڵ‬ຯਂ͍

38.

ΠςϨʔλʔͰͷOJMอূ 4&

39.

ΠςϨʔλʔͰͷOJMอূ ࣍ͷ஋͕ͳ͍ͱ͖͸OJMΛ໿ଋ ⾣ ͜Ε·Ͱ͸QSFDPOEJUJPO'BJMVSFͷՄೳੑ΋ ⾣ ࠓ‫ޙ‬͸ɺඞͣOJMͰද‫͢ݱ‬Δํ਑ʹ Advance to the next element and return it, or `nil` if no next element exists.Once `nil` has been returned, all subsequent calls return `nil`. protocol IteratorProtocol { associatedtype Element mutating func next() -> Element? ^ 4XJGU1SFWJFX

40.

4&ΠςϨʔλʔͰͷOJMอূ ‫ײ‬૝ ํ਑ͱͯ͠ྫ֎͕আ͔Εͨͷ͸‫͍͠خ‬ ίϝϯτͷमਖ਼͚ͩͰ‫ͳ͘͠خ‬ΕΔͷɺ͓΋͠Ζ͍

41.

#PPMFBO5ZQFϓϩτίϧͷഇࢭ 4&

42.

#PPMFBO5ZQFϓϩτίϧͷഇࢭ ࠜ‫ڌ‬ ⾣ ਅِ஋ͷந৅Խ͸ෳࡶ͞Λট͘ ⾣ ‫ߦݱ‬ͷ"1*Ͱ͸େ఍#PPM‫ܕ‬Λ࠾Δ ⾣ 0CK$#PPMͱ#PPMͷ૬‫ʹޓ‬ม‫׵‬Մೳ protocol BooleanType { var boolValue: Bool { get } } 4XJGUY

43.
[beta]
'PVOEBUJPOͷ஋‫ܕ‬

ந৅ԽΛҙࣝ͢Δ͜ͱʹΑΔෳࡶԽ
⾣ #PPMͰ͸ͳ͘#PPMFBO5ZQFΛ࢖͏
⾣ ͜ͷॻ͖ํʹͲΕ͘Β͍Ձ஋͕͋ΔͩΖ͏͔ʁ
func remove<T:BooleanType>(recursively flag: T) {

}
func isKindOf<R:BooleanType>(type: AnyType) -> R {

}

4XJGUY

44.

'PVOEBUJPOͷ஋‫ܕ‬ ৚݅෼‫Ͱذ‬͸ඒ͘͠࢖͍͑ͯͨʜ ⾣ JG΍HVBSE͸#PPMFBO5ZQFʹରԠ ⾣ ͜ͷ৔߹͸ඒ͘͠‫ػ‬ೳ͢Δ struct Condition : BooleanType { … } let condition = Condition(…) if condition { … Ҏલ͸ɺεϚʔτʹൺֱՄೳͩͬͨ } 4XJGUY

45.

#PPMFBO5ZQFϓϩτίϧͷഇࢭ ഇࢭʹΑΔӨ‫ڹ‬ʢ༧ఆʣ ⾣ #PPMFBO5ZQFϓϩτίϧ͕ফ໓ ⾣ ԋࢉࢠ!, &&, ||Λ#PPM‫Ͱܕ‬ѻ͏ func && (lhs: Bool, rhs: () -> Bool) -> Bool func || (lhs: Bool, rhs: () -> Bool) -> Bool func ! (a: Bool) -> Bool 4XJGU1SFWJFX

46.

4&#PPMFBO5ZQFϓϩτίϧͷഇࢭ ‫ײ‬૝ ϓϩτίϧഇࢭͰશମ͕γϯϓϧʹͳΓͦ͏ ந৅ԽͷඞཁੑΛߟ͑Δͱ͖ͷɺྑ͍ࢀߟʹ΋ͳΓͦ͏

47.

จ๏ʹؔ͢Δมߋ

48.

ϝϯόʔࢀরͰ࢖͑Δ༧໿‫ޠ‬ 4&

49.

ϝϯόʔࢀরͰ࢖͑Δ༧໿‫ޠ‬ ΄΅ࣗ༝ʹ༧໿‫ޠ‬Λ࢖༻Մೳʹ ⾣ ࢀর࣌ɺ΄΅ࣗ༝ʹ༧໿‫͑࢖͕ޠ‬Δ ⾣ ఆٛͰ͸AA͕ඞཁ // 定義では `` が必要 enum DrawingStyle { case `default` case `repeat` case fit } // 使用時は `` が不要 let style = DrawingStyle.default 4XJGU1SFWJFX

50.

ϝϯόʔࢀরͰ࢖͑Δ༧໿‫ޠ‬ ‫ܕ‬ͷϝϯόʔʹ͍ͭͯ΋ಉ༷ ⾣ ϓϩύςΟ΍ϝιουͰ΋ಉ༷ // 定義では `` が必要 class Object { var `default`: Int func `repeat`(_ times: Int) -> String { … } } // 使用時は `` が不要 let object = Object() let value = object.default 4XJGU1SFWJFX

51.

ϝϯόʔࢀরͰ࢖͑Δ༧໿‫ޠ‬ ࢖༻Ͱ͖ͳ͍༧໿‫ޠ‬ ⾣ ‫ʹޠݴ‬ΑΔධՁ͞ΕΔ‫ޠ‬͸ର৅֎ ⾣ ͦΕΒΛ࢖͏ͱ͖͸AAͰ‫ׅ‬Δ // 定義では `` が必要 enum Evaluate { case `self` case `dynamicType` } // 使用時も `` が必要 let eval = Evaluate.`self` 4XJGU1SFWJFX

52.

4&ϝϯόʔࢀরͰ࢖͑Δ༧໿‫ޠ‬ ‫ײ‬૝ ΄ͱΜͲͷ༧໿‫ී͕ޠ‬௨ʹ࢖͑ͯ‫͍͠خ‬ ಛʹEFGBVMU͕ͦͷ··ॻ͚Δޭ੷͸େ͖ͦ͏

53.

ϓϩτίϧද‫ؔ͢ʹه‬Δมߋ

54.

QSPUPDPM" #ΛԋࢉࢠͰද‫ݱ‬ 4&

55.

QSPUPDPM" #ΛԋࢉࢠͰද‫ݱ‬ ϓϩτίϧͷ૊Έ߹ΘͤΛͰද‫ݱ‬ ⾣ ͜Ε·Ͱ͸QSPUPDPM" #Ͱද‫ݱ‬ ⾣ ࠓ‫ޙ‬͸"#Ͱද‫ݱ‬ʢ༧ఆʣ // プロトコル型で使う let p: A & B = Value() // 型引数で使う func doSomething<T: A & B>(_ value: T) { } 4XJGU1SFWJFX

56.

4&QSPUPDPM" #ΛԋࢉࢠͰද‫ݱ‬ ‫ײ‬૝ ‫͍͠خ‬Α͏ͳɺ‫͍͘ʹݟ‬Α͏ͳ ैલͷํ͕໘౗͚ͩͲɺ෼͔Γ΍͍͢ʁ‫׳‬Εͷ໰୊ʁ

57.

‫͢܎ؔʹܕ‬Δมߋ

58.

ԋࢉࢠΛ‫૷࣮͕ܕ‬ 4&

59.

ԋࢉࢠΛ‫૷࣮͕ܕ‬ ֓ཁ ⾣ ϓϩτίϧ͕ཁ‫͢ٻ‬ΔԋࢉࢠΛ‫૷࣮Ͱܕ‬ʢ༧ఆʣ ⾣ ॴଐ͢Δ‫ͳʹྎ໌͕ܕ‬Δ struct Value : Equatable { static func == (lhs: Value, rhs: Value) -> Bool { } } 4XJGU1SFWJFX

60.
[beta]
ԋࢉࢠΛ‫૷࣮͕ܕ‬

ΦϒδΣΫτࢦ޲ͱͷ૬ੑ͸ʁ
⾣ ‫ܧ‬ঝΛߟྀ͢Δͱɺϝιου͕ඞཁʹͳΔ
⾣ ΦϒδΣΫτࢦ޲తʹ͸ࣗવͳ࣮૷
class Base : Equatable {
func isEqual(to rhs: Base) -> Bool {}
}
class Sub : Base {
override func isEqual(to rhs: Base) -> Bool {}
}
func == (lhs: Base, rhs: Base) -> Bool {
return lhs.isEqual(to: rhs)
}

4XJGUY

61.

ԋࢉࢠΛ‫૷࣮͕ܕ‬ ΦϒδΣΫτࢦ޲ͱͷ૬ੑ͸ʁ ⾣ ੩తϝιου͸‫ܧ‬ঝͰ͖Δ ⾣ ൺֱ࣌ʹ‫ܧ‬ঝΛՃຯͯ͘͠ΕΔͩΖ͏͔ʁ class Base : Equatable { class func == (lhs: Base, rhs: Base) -> Bool {…} } class Sub : Base { override class func == (lhs: Base, rhs: Base) -> Bool {…} } 4XJGU1SFWJFX

62.

4&ԋࢉࢠΛ‫૷࣮͕ܕ‬ ‫ײ‬૝ ࠷ॳʹͱͬͯ΋ࠞཚͨ͠ͱ͜Ζʂྑ͍ʂ ΦϒδΣΫτࢦ޲ͱͷ૬ੑ͸ґવɺΠϚΠν͔΋͠Εͳ͍

63.

JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍‫ݶ‬ 4&

64.
[beta]
JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍‫ݶ‬

͜Ε·Ͱͷ໰୊
⾣ JOPVUม਺ΛΫϩʔδϟʔͰΩϟϓνϟՄೳ
⾣ ΫϩʔδϟʔΛ࣮ߦͯ͠΋ߋ৽͞Εͳ͍
func makeIncrementer(inout value: Int) -> () -> Void {
return { value += 1; print("Inside:", value) }
}
var value = 1
let incrementer = makeIncrementer(&value)
print("Outside:", value)
incrementer()
print("Outside:", value)
incrementer()
print("Outside:", value)

// Outside: 1
// Inside: 2
// Outside: 1
// Inside: 3
// Outside: 1

มߋ͕ॻ͖໭͞Εͳ͍
มߋ͕ॻ͖໭͞Εͳ͍

4XJGUY

65.

JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍‫ݶ‬ ΫϩʔδϟʔͷੜଘൣғΛ੍‫ݶ‬ ⾣ JOPVUม਺ͷΩϟϓνϟΛ!OPFTDBQFʹ੍‫ݶ‬ ⾣ ಡΈऔΓઐ༻ʢෳ੡ʣͳΒɺΩϟϓνϟՄೳ func something(value: inout Int) { let noescaped: @noescape () -> Void = { value = 10 } let escaped: () -> Void = { [value] in print(value) ಡΈऔΓઐ༻ͱͯ͠ } ΩϟϓνϟՄೳ } 4XJGU1SFWJFX

66.

4&JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍‫ݶ‬ ‫ײ‬૝ ߟ͑ͨ͜ͱͳ͔ͬͨɺྑ͍ 8SJUFCBDLͷ࢓૊ΈͱΩϟϓνϟ͸͔֬ʹ૬ੑѱͦ͏

67.

‫ߏޠݴ‬จͷ࡟আ

68.

λϓϧεϓϥοτͷഇࢭ 4&

69.

λϓϧεϓϥοτͷഇࢭ λϓϧεϓϥοτͱ͸ ⾣ Ҿ਺Ϧετͱͯ͠λϓϧΛ௚઀౉ͤΔ ⾣ ϥϕϧ໊ͱొ৔ॱ͸Ұக͢Δඞཁ͋Γ func total(price: Int, count: Int) -> Int { } // 引数リストを丸ごとタプルで扱える let item: (Int, count: Int) = (100, 5) total(item) 4XJGU

70.

λϓϧεϓϥοτͷഇࢭ λϓϧεϓϥοτߏจͷ࡟আ ⾣ ‫ݪ‬ଇɺҾ਺ϦετʹλϓϧΛ౉ͤͳ͘͢Δ ⾣ Φʔόʔϩʔυͱ‫צ‬ҧ͍͠΍͍ͨ͢Ί ⾣ λΠϓνΣοΧʔʹͱͬͯߴෛՙͳͨΊ func total(price: Int, count: Int) -> Int { } // 原則、引数リストを1つのタプルで表現できない let item: (Int, count: Int) = (100, 5) total(item) FSSPSNJTTJOHBSHVNFOUGPSQBSBNFUFSDPVOUJODBMM 4XJGU1SFWJFX

71.
[beta]
λϓϧεϓϥοτͷഇࢭ

δΣωϦοΫͰࣅͨॻ͖ํ͸Մೳ
⾣ ͻͱͭͷ‫ܕ‬Ҿ਺Ͱɺෳ਺ͷҾ਺Λѻ͏
⾣ ͨͩ͠ɺؔ਺Λ௚઀౉͢ͱ͖ʹ‫ݶ‬Δ

func apply<T, R>(value: T, f: (T) -> R) -> R {
return f(value)
}
let item: (Int, count: Int) = (100, 5)
func total(price: Int, count: Int) -> Int {  }
apply(value: item, f: total)
4XJGU1SFWJFX

72.

4&λϓϧεϓϥοτͷഇࢭ ‫ײ‬૝ ‫ڵ‬ຯਂ͍‫ػ‬ೳ͚ͩΕͲແͯ͘ྑ͍‫͕͢ؾ‬Δ δΣωϦοΫͷྨࣅ‫ػ‬ೳͰॆ෼࣮༻తͳҹ৅

73.

จ๏ʹؔ͢Δ‫ػ‬ೳ௥Ճ

74.

DBTFͰͷෳ਺ύλʔϯϚον 4&

75.

DBTFͰͷෳ਺ύλʔϯϚον ֓ཁ ⾣ ෳ਺ύλʔϯͰϚον͢Δม਺ΛఆٛՄೳ ⾣ ‫ڞ‬௨ͨ͠ॲཧΛ؆୯ʹ‫ࡌه‬Մೳ switch (value1, value2) { case let (value?, nil), let (nil, value?): return value case let (value1?, value2?): return value1 + value2 case (nil, nil): return 0 } 4XJGU1SFWJFX

76.

DBTFͰͷෳ਺ύλʔϯϚον ग़དྷΔΑ͏ʹͳΔॻ͖ํ switch device { case let .iPhone(_, osVersion), network, _) where osVersion > 8.0, let .iPad(_, osVersion, network, _, true) where network == .cellular, doSomething(device, osVersion, network) case .iPodTouch: doSomething(device) default: doSomething() } 4XJGU1SFWJFX

77.

4&DBTFͰͷෳ਺ύλʔϯϚον ‫ײ‬૝ ෳ਺ͷ৚݅Ͱಉ͡ॲཧΛ‫ه‬ड़Ͱ͖ͯศར ͜ΕͰGBMMUISPVHIΛ࢖͏৔໘͕΄ͱΜͲͳ͘ͳΓͦ͏ʂ

78.

γʔέϯεΛ࡞Δؔ਺ 4&

79.

γʔέϯεΛ࡞Δؔ਺ ॳ‫ظ‬஋͔ΒγʔέϯεΛ࡞Δ ⾣ TFRVFODF GJSTU OFYU ͰγʔέϯεΛ࡞Δ ⾣ OFYUͷؔ਺͕OJMΛฦͤ͹ऴྃ let values = sequence(first: 1) { $0 * 2 } "OZ4FRVFODFӲӴ♫೸ӕਃӶӵ MFUWBMVFT"OZ4FRVFODF\ "OZ*UFSBUPS*OUJO WBSGJSTU SFUVSO"OZ*UFSBUPS\ EFGFS\ GJSTU  ^ SFUVSOGJSTU ^ ^ 4XJGU1SFWJFX

80.

γʔέϯεΛ࡞Δؔ਺ ॳ‫ظ‬ঢ়ଶ͔ΒγʔέϯεΛ࡞Δ ⾣ TFRVFODF TUBUF OFYU ͰγʔέϯεΛ࡞Δ ⾣ OFYUͷؔ਺͕OJMΛฦͤ͹ऴྃ MFUEBUFTTFRVFODF TUBUF \ EBZJOPVU*OU %BUF JO EFGFS\ EBZ  ^ MFUDBMFOEBS$BMFOEBSDVSSFOU WBSDPNQPOFOUT DBMFOEBSDPNQPOFOUT <ZFBS NPOUI EBZ>  GSPN%BUF   DPNQPOFOUTEBZEBZ SFUVSODBMFOEBSEBUF GSPNDPNQPOFOUT  ^ 4XJGU1SFWJFX

81.

4&γʔέϯεΛ࡞Δؔ਺ ‫ײ‬૝ ೚ҙͷγʔέϯεΛ؆୯ʹ࡞Εͯ‫͍͠خ‬ ಛʹऴ୺ͷͳ͍γʔέϯεΛ࡞Δͷʹ޲͍͍ͯΔ͸ͣ

82.

4MJDF͔Β‫ݩ‬ͷγʔέϯεΛࢀর 4&

83.

4MJDF͔Β‫ݩ‬ͷγʔέϯεΛࢀর ֓ཁ ⾣ ֤छ4MJDF‫ʹܕ‬CBTFϓϩύςΟΛ࣋ͨͤΔ ⾣ TVCTDSJQUͷॻ͖ࠐΈ࣮૷Λγϯϓϧʹ͢Δʁ ҙਤ͍ͯ͠Δૂ͍͕ɺ·ͩ௫Ίͳ͍ʜ struct MutableSlice<Base : MutableIndexable> { var base: Base { get } } 4XJGU1SFWJFX

84.

4MJDF͔Β‫ݩ‬ͷγʔέϯεΛࢀর CBTFΛ‫ͳʹؾ͍ͯͯ͠࡯؍‬Δ఺ ⾣ ϓϩτίϧͰ͸‫ط‬ఆ͞Ε͍ͯͳ͍ ⾣ ‫ʹܕ‬௚઀࣮૷͞Ε͍ͯΔ ⾣ ⾣ w ༷ʑͳ4MJDF‫͞૷࣮ʹܕ‬Ε͍ͯΔ w "SSBZ4MJDFʹ͸࣮૷͞Ε͍ͯͳ͍ εϥΠεΛॻ͖‫͖ͱͨ͑׵‬ʜ w ‫ݩ‬ͷ಺༰͸ॻ͖มΘΒͳ͍ w CBTF͕ࢦ͢ɺ‫ݩ‬ͷෳ੡͸ॻ͖‫׵‬ΘΔ ͷ࣮૷Λ‫ݟ‬Δ‫ݶ‬ΓͰ͸ɺ w TVCTDSJQUͷ࣮૷ʹCBTF͸࢖ͬͯͳͦ͞͏ w @XSJUF#BDL.VUBCMF4MJDFؔ਺Λ࢖͍ͬͯΔ 4XJGU1SFWJFX

85.

4&4MJDF͔Β‫ݩ‬ͷγʔέϯεΛࢀর ‫ײ‬૝ ஌ࣝෆ଍ʹΑΓҙਤ͕௫Ίͣʜ ͱΓ͋͑ͣCBTF͸಺෦తʹ࢖ΘΕΔ΋ͷʁ

86.

ࠓճ͸ɺ͜͜·Ͱ

87.

4XJGU ͰมΘͬͨͱ͜Ζ  "1*%FTJHO(VJEFMJOFT  4&4XJGU"1*ΨΠυϥΠϯ  4&໋໊‫ن‬ଇ΁ͷΨΠυϥΠϯͷద༻  4&ඪ४ϥΠϒϥϦ΁ͷద༻  4&'PVOEBUJPO΁ͷద༻ ‫ࢥޠݴ‬૝ʹؔ͢Δมߋ  4&໭Γ஋Λ࢖Θͳ͍ͱ‫ʹࠂܯ‬  4&*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ΁  4&খ਺఺਺ϓϩτίϧ

88.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ࢥޠݴ‬૝ʹؔ͢Δมߋ  4&'PVOEBUJPOͷ஋‫ܕ‬  4&OJMϙΠϯλʔද‫ݱ‬  4&ίϨΫγϣϯͷ࠶ઃ‫ܭ‬  4&ΠςϨʔλʔͰͷOJMอূ  4&#PPMFBO5ZQFϓϩτίϧͷഇࢭ จ๏ʹؔ͢Δมߋ  4&ԋࢉࢠηΫγϣϯͰͷίϝϯτ  4&Ҿ਺Ϧετͷ‫ހׅ‬Λඞਢʹ

89.

4XJGU ͰมΘͬͨͱ͜Ζ  จ๏ʹؔ͢Δมߋ  4&Ҿ਺ϥϕϧ໊ͷ‫ن‬ଇΛ౷Ұ  4&ଐੑҾ਺ͷ&RVBMΛ$PMPOʹมߋ  4&ϝϯόʔࢀরͰ࢖͑Δ༧໿‫ޠ‬  4&ྻ‫Ͱ಺ܕڍ‬ͷྻ‫ࢠڍ‬ද‫ه‬  4&‫ط‬ఆ஋Λ࣋ͭҾ਺ͷॱংΛ‫ݻ‬ఆ ϓϩτίϧද‫ؔ͢ʹه‬Δมߋ  4&QSPUPDPM" #ΛԋࢉࢠͰද‫ݱ‬  4&-JUFSBM$POWFSUJCMFͷ໊শมߋ

90.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ؔ͢ʹܕ‬Δมߋ  4&ԋࢉࢠΛ‫૷࣮͕ܕ‬  4&!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ  4&‫ʹܕ‬ରͯ͠JOPVUΛఆٛ  4&JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍‫ݶ‬  4&6ONBOBHFE͸4XJGUϙΠϯλΛѻ͏ ‫ߏޠݴ‬จͷ࡟আ  4&$ελΠϧGPSϧʔϓͷ࡟আ  4&ԋࢉࢠ ͱͷ࡟আ

91.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ߏޠݴ‬จͷ࡟আ  4&ΧϦʔԽؔ਺ߏจͷ࡟আ  4&Ҿ਺Ϧετ͔ΒWBSΛ࡟আ  4&Ҿ਺Ϧετ͔ΒMFUΛ࡟আ  4&λϓϧεϓϥοτͷഇࢭ จ๏ʹؔ͢Δ‫ػ‬ೳ௥Ճ  4&δΣωϦοΫͳ‫ܕ‬ΤΠϦΞε  4&DBTFͰͷෳ਺ύλʔϯϚον

92.

4XJGU ͰมΘͬͨͱ͜Ζ  ‫ؔ͢ʹܕ‬Δ‫ػ‬ೳ௥Ճ  4&γʔέϯε͔ΒཁૉΛ‫͚ͯͭݟ‬औಘ  4&γʔέϯεΛ࡞Δؔ਺  4&0QUJPOBM޲͚GMBU.BQΛ஗ԆՄೳʹ  4&4MJDF͔Β‫ݩ‬ͷγʔέϯεΛࢀর ࣮ߦ‫ؔ͢ʹڥ؀‬Δมߋ  4&σόοάࣝผࢠͷϞμϯԽ  4&MJOFࣝผࢠͷᐆດੑΛղফ  4&1MBZHSPVOEϦςϥϧͷϞμϯԽ

93.

Enjoy! Swift /* Thank you */