>100 Views
July 24, 16
スライド概要
Swift 3.0 の新機能に関して、新機能の追加と変更まわりを記した資料です。削除された機能や Objective-C 寄りの機能には触れていません。カジュアル Swift 勉強会での話を少しスリムにしつつ、調べきれなかった事柄を追加してあります。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 2,175 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
4XJGU ͷ৽ػೳ Ճɾมߋ·ΘΓ͚ͩɺͬ͘͟Γհ /* J1IPOF%FW4BQQPSPษڧձ+VM */ &;/&5۽୩༑ 4XJGU%FWFMPQFS1SFWJFX 9DPEFCFUB IUUQF[OFUKQ
۽୩༑ /* @es_kumagai */ 5PNPIJSP,VNBHBJ /** */ ⾣ 4XJGU͕ޠݴେ͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษڧձ͕େ͖Ͱ͢ʂ ⾣ ษڧձͰൃද͢Δͷ͕ͱ͖ͬͯͰ͢ʂ ⾣ ॻ੶9DPEFపఈղઆॻ͖·ͨ͠ɻ ⾣ ٕज़ϒϩά&;/&5Λॻ͍ͨΓͯ͠·͢ɻ
ษڧձΛ։࠵ͯ͠·͢ɻ ԣJ1IPOF։ൃऀษڧձ ΧδϡΞϧ4XJGUษڧձ ZJEFW ˏԣɾഅंಓ DTXJGU !ԣɾ੨༿ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕తͷձ ΏΔ͘ΈΜͳͰ4XJGU͍ͯͭʹޠݴ ޠΒ͑Δ͕ཉͯ࢝͘͠Ίͨձ ୈճ݄ޙʹ։࠵͔͠Εͳ͍ ୈ̍̌ճΛ݄ʹ։࠵༧ఆ /** ͍ئ J044XJGUͷษڧձΛ։࠵ͯ͠·͢ɻ ҆৺ͯ͠ஊٛʹՖΛ࡙͔ͤΒΕ·͢Α͏ʹɻ */
$PEF1JFDFGPS04 9 ษڧձΛָ͠ΉΞϓϦ ιʔείʔυΛ5XJUUFSͱ(JTUʹಉ࣌ߘͰ͖Δ ษڧձͰݟΛΈΜͳͱڞ༗͍ͨ࣌͠ͱ͔ʹศརʂ Ͱ͖Δ͜ͱ #devsap
4XJGU XJMMCFSFMFBTFETPNFUJNFJOMBUF
ͦΖͦΖ4XJGUΛ Ѳ͓͔ͯ͠ͳ͚ΕͳΒͳ͍
4XJGU ֓ཁΛͬ͘͟Γԡ͑͞Δ
4XJGU֓ཁ
4XJGU τοϓχϡʔε ⾣ ͷޙʹϦϦʔε ⾣ 4XJGU͔Βͷഁյతͳ༷มߋ
4XJGU ඪ ⾣ 4XJGUޠݴΛ֬ఆɾख़ͤ͞Δ ⾣ 4XJGUҎ߱Ͱͷιʔείʔυͷ ޓੑΛࢦ͢ʢྗඪʣ ⾣ 4XJGUҎ߱ͷιʔεޓഁյ ࠷খݶͷӨͰڹͷ࣮ݱΛࢦ͢
4XJGU ཁ ⾣ ৽͍͠"1*ΨΠυϥΠϯ ⾣ ༷ޠݴΛચ࿅ ⾣ 0CKFDUJWF$$ͷίʔυΛ 4XJGUจԽʹ߹Θͤͯऔࠐ ⾣ ίϯύΠϥ*%&ͷ্࣭ ⾣ 4XJGUύοέʔδϚωʔδϟʔ
4XJGU ண ޠݴͷ҆ఆԽΛਤΓ ଞڥͷҠ২ੑΛݟਾ͑Δ
4XJGU ࢟ ඪୡͷͨΊʹ ιʔεޓੑͷഁյࣙ͞ͳ͍ߏ͑
"1*%FTJHO(VJEFMJOFT
ΨΠυϥΠϯͷద༻ 4& 4&
"1*%FTJHO(VJEFMJOFT झࢫ ⾣ ؆ܿʹ௲ΒΕͨΨΠυϥΠϯ ⾣ ૉఢͳ"1*Λॻ͜͏ʂ ⾣ 4XJGUࣗΨΠυϥΠϯʹԊͬͯมߋ IUUQTTXJGUPSHEPDVNFOUBUJPOBQJEFTJHOHVJEFMJOFT
"1*%FTJHO(VJEFMJOFT ίʔυͷํ ⾣ ࣮ମ̍ͭఆٛ͠ɺ܁Γฦ͠͏ ⾣ "1*ͷσβΠϯ͕ ػೳͷར༻Λ໌ྎ͔ͭ؆ܿʹ͢Δ ⾣ ΨΠυϥΠϯͷݪଇΑΓ ίϯςΩετͰͷ໌շ͕͞༏ઌ ⾣ ࠷গͳ͍จࣈͰ ίʔυΛॻ͘ͷ͕ඒಙͰͳ͍
"1*%FTJHO(VJEFMJOFT υΩϡϝϯτͷํ ⾣ υΩϡϝϯτ࡞͕ "1*σβΠϯΛચ࿅͢Δ ⾣ ࣗવͳݴ༿Ͱॻ͚ͳ͍ͳΒ "1*σβΠϯ͕ؒҧ͍ͬͯΔ͔ ⾣ υΩϡϝϯτΛॻ͘͜ͱΛ ઌૹΓ͠ͳ͍͜ͱ
"1*%FTJHO(VJEFMJOFT ѻΘΕ͍ͯΔσβΠϯࢦ ⾣ ໊લ͚ʹ͍ͭͯ ⾣ ྲྀΕΔΑ͏ʹ͑ΔΑ͏ʹ ⾣ ઐ༻ޠΛ͏ͱ͖ͷҙ ⾣ ׳शతͳද͍ͯͭʹݱ ⾣ ಛผͳ໘
"1*%FTJHO(VJEFMJOFTΛಡΉͱ 4XJGU͕ଊ͑͘͢ͳΔҹ
"1*%FTJHO(VJEFMJOFT ࢀߟࢿྉ IUUQXXXTMJEFTIBSFOFUUPNPIJSPLVNBHBJTXJGUDTXJGU
ඪ४ϥΠϒϥϦͷద༻ 4&
ඪ४ϥΠϒϥϦͷద༻ ϓϩτίϧ໊ͷl5ZQFzඌࣙΛআ ⾣ ϓϩτίϧ໊͔Β5ZQFΛআ ⾣ ओཁͳͱ໊ܕඃΒͳ͍Α͏ʹɺಛผʹ l1SPUPDPMzඌࣙΛ͚Δ߹͋Δ 4XJGU 4XJGU $PMMFDUJPO $PMMFDUJPO5ZQF *OUFHFS *OUFHFS5ZQF &SSPS1SPUPDPM &SSPS5ZQF ˞͔ͭزൈਮ
ඪ४ϥΠϒϥϦͷద༻ l(FOFSBUPSzΛl*UFSBUPSz ⾣ l(FOFSBUPSz͔Βl*UFSBUPSzʹ໊শมߋ ⾣ ؔ࿈͢ΔͷؚΊ໊ͯশมߋ 4XJGU 4XJGU *OUFSBUPS1SPUPDPM (FOFSBUPS5ZQF NBLF*UFSBUPS HFOFSBUF *OEFYJOH*UFSBUPS&MFNFOUT *OEFYJOH(FOFSBUPS&MFNFOUT ˞͔ͭزൈਮ
ඪ४ϥΠϒϥϦͷద༻ #JUܕͷআ ⾣ #JU͕ܕআ͞Εͨ ⾣ ΘΓʹ*OUܕΛ͏ ⾣ #JUͷସʹ*OUද͏ͦ͗͢ߴ͕ྗݱ enum Bit : Int, Comparable, RandomAccessIndexType { case Zero case One } 4XJGUY
ඪ४ϥΠϒϥϦͷద༻
ϙΠϯλʔܕͷܕҾ໊Λมߋ
⾣ ܕҾ໊Λ
l.FNPSZz͔Βl1PJOUFFzʹมߋ
struct UnsafePointer<Pointee> : Strideable, Hashable {
var pointee: Pointee { get }
subscript(i: Int) -> Pointee { get }
}
4XJGU1SFWJFX
ඪ४ϥΠϒϥϦͷద༻ ϝιου໊ͷมߋ ⾣ ෭࡞༻ΛΘͳ͍߹໊ࢺతͳ໊લ ໊લ͕ಈࢺతͳΒա͢ʹܗڈΔ ⾣ ෭࡞༻Λ͏߹໋ྩతͳಈࢺͷ໊લ 4XJGU 4XJGU EJTUBODF UP EJTUBODF5P TPSUFE TPSU TPSU TPSU*O1MBDF SFWFSTFE SFWFSTF FOVNFSBUFE FOVNFSBUF ˞͔ͭزൈਮ
'PVOEBUJPOͷద༻ 4&
'PVOEBUJPOͷద༻ /4໊લۭؒͷআ ⾣ Ϋϥε໊ͷ/4಄ࣙΛআ ⾣ ͍͔ͭ͘ͷΫϥεͷ಄ࣙΔ 4XJGU 4XJGU #VOEMF /4#VOEMF 'JMF.BOBHFS /4'JMF.BOBHFS 63-4FTTJPO /463-4FTTJPO ˞͔ͭزൈਮ
'PVOEBUJPOͷద༻ ͍͔ͭ͘ͷ໊લۭؒଘଓ ⾣ 0CKFDUJWF$ͱͷ݁ͼ͖͕͍ڧͷ ⾣ ϓϥοτϑΥʔϜʹΏ͔Γͷਂ͍ͷ ⾣ σʔλ৽͕ܕઃ͞Εͨͷ 4& 4XJGU ଘଓཧ༝ /40CKFDU 0CKFDUJWF$ͱਂؔ͘ /46TFS/PUJpDBUJPO ϓϥοτϑΥʔϜΏ͔Γͷͷ /4%BUB %BUBܕΛ৽ઃͯ͠ϒϦοδ /41SFEJDBUF ࠓޙɺܕͷ৽ઃΛܭը ˞͔ͭزൈਮ
'PVOEBUJPOͷద༻ ໊લۭؒͷআ͍ͭͰʹ໊শมߋ ⾣ ྑ͍ػձͳͷͰ໊শมߋ ⾣ ඞཁʹԠͯ͡ωετ͢ʹܕΔ ⾣ ͔ͭزະ࣮ʁ /40VUQVU4USFBN 4XJGU 4XJGU 1SPDFTT /45BTL /44USJOH&ODPEJOH /44USJOH&ODPEJOH 4USJOH&ODPEJOH /44USJOH&ODPEJOH 63-3FRVFTU$BDIF1PMJDZ /463-3FRVFTU$BDIF1PMJDZ ˞͔ͭزൈਮ
ࢥޠݴʹؔ͢Δมߋ
ΓΛΘͳ͍ͱʹࠂܯ 4&
ඪ४ϥΠϒϥϦͷద༻ ҎલɺΓΛΘͳͯ͘͠ͳࠂܯ ⾣ 4XJGUɺ ؔͷ݁ՌΛड͚औΒͳͯ͘͞ࠂܯΕͳ͍ ⾣ ͳ͍ͨ͠ࠂܯΒ!XBSO@VOVTFE@SFTVMUΛ༩ class Item { // 戻り値を使わないと警告される @warn_unused_result func makeFilter() -> Filter {…} // 戻り値を使わなくても警告されない func apply(filter: Filter) -> Item {…} } 4XJGUY
ඪ४ϥΠϒϥϦͷద༻ ࠓޙɺΓΛΘͳ͍ͱ͋ࠂܯΓ ⾣ 4XJGUɺ ؔͷ݁ՌΛड͚औΒͳ͍ͱ͞ࠂܯΕΔ ⾣ ࠂܯෆཁͳΒ!EJTDBSEBCMF3FTVMUΛ༩ class Item { // 戻り値を使わないと警告される func makeFilter() -> Filter {…} // 戻り値を使わなくても警告されない @discardableResult func apply(filter: Filter) -> Item {…} } 4XJGU1SFWJFX
*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ 4&
*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ ֓ཁ ⾣ ҉Ξϯϥοϓ!*60 ଐੑ ͱͯ͠ѻ͏ ⾣ *NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭͷํ ႁᡔᇶ⻝әѬᒇᦸӓҴӴ let optionalValue: Int! = 100 4XJGU1SFWJFX
*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ ೝࣝͷ͞Ε͔ͨ ⾣ *NQMJDJUMZ6OXSBQQFE0QUJPOBMͱͯ͠ೝࣝ ⾣ جຊతͳ͍ํैલͱಉ͡ // 今は ImplicitlyUnwrappedOptional 型として認識 var a: Int! // こちらは従来通り Optional 型として認識 var b: Int? 4XJGU1SFWJFX
*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ ਪ0QUJPOBMѻ͍ ⾣ ܕਪͰ0QUJPOBMѻ͍ ⾣ ࣦഊՄೳΠχγϟϥΠβͱ૬ੑ͕ྑ͍ enum Bit : Int { case zero case one } Γͷܕ#JUܕ let bit = Bit(rawValue: 1) ड͚Δม#JU ͱܕਪ͞Εɺ ͕͋Δ͔Λ൱Ԡͳ͘ҙࣝͤ͞ΒΕΔ 4XJGU1SFWJFX
খϓϩτίϧ 4&
খϓϩτίϧ ϓϩτίϧઃܭͷௐ ⾣ େখൺֱՄೳ ⾣ খϦςϥϧʹରԠ ⾣ ༨ԋࢉࢠͷഇࢭ ⾣ جຊతͳఆͷఏڙ ⾣ 'MPBU'͕ܕMPBUJOH1PJOUʹ४ڌ
খϓϩτίϧ 'MPBUJOH1PJOUϓϩτίϧ ⾣ ҎલɺมΠχγϟϥΠβͱঢ়گఆɺ ಛघঢ়ଶʢ㱣 /B/ Λࣔ͢ϓϩύςΟͷΈ ⾣ ੜɺԋࢉɺఆͳͲͷػೳΛՃ ߲ ༻్ *OUFHFS-JUFSBM$POWFSUJCMF ϦςϥϧʹରԠ JOJU TJHOFYQPOFOUTJHOJpDBOE ෆಈখͰͷॳظԽ TUBUJDWBSSBEJY ج TUBUJDWBSQJ ԁप WBSVNQ ࣍ʹදݱՄೳͳͱͷࠩ ˞͔ͭزൈਮ
খϓϩτίϧ #JOBSZ'MPBUJOH1PJOUϓϩτίϧ ⾣ ͕̎جͷුಈখදݱ ⾣ 'MPBUJOH1PJOUϓϩτίϧΛܧঝ ⾣ ϏοτύλʔϯʹΑΔૢ࡞ΛՃ ߲ ༻్ 3BX4JHOJpDBOE Ծද͠ͳ߸ූ͏Ͱݱܕ 3BX&YQPOFOU ࢦද͠ͳ߸ූ͏Ͱݱܕ TUBUJDWBS TJHOJpDBOE#JU$PVOU WBSTJHOJpDBOE#JU1BUUFSO Ծද͑ͰݱΔϏοτ WBSCJOBEF ̎جΛࢦ෦Ͱྦྷͨ͠ ԾΛද͢ݱΔϏοτύλʔϯ ˞͔ͭزൈਮ
খϓϩτίϧ
ԋࢉʹରԠ
⾣ ϓϩτίϧ͕ࣗԋࢉʹରԠ
⾣ ࢛ଇԋࢉɺେখൺֱ
func add<T: FloatingPoint>(lhs: T, rhs: T) -> T {
return lhs + rhs
}
۩ମతͳܕΛఆ͠ͳͯ͘ԋࢉՄೳʹ
4XJGU1SFWJFX
'PVOEBUJPOͷܕ 4&
'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
'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
'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*%
OJMϙΠϯλʔදݱ 4&
OJMϙΠϯλʔදݱ
ҎલɺϙΠϯλʔࣗͰදݱ
⾣ ϙΠϯλʔࣗͰOJMϙΠϯλʔΛදݱ
⾣ ϙΠϯλʔܕͷྲّྀͰOJMఆ͕ඞཁ
let pointer: UnsafePointer<Int> = …
if pointer != nil {
print(pointer.memory)
}
else {
}
4XJGUY
OJMϙΠϯλʔදݱ ࠓޙɺΦϓγϣφϧͰදݱ ⾣ OJMϙΠϯλʔΦϓγϣφϧͰදݱ ⾣ 4XJGUͷྲّྀͰOJMఆ͕Մೳ let pointer: UnsafePointer<Int>? = … if let value = pointer?.pointee { print(value) } else { } 4XJGU1SFWJFX
ίϨΫγϣϯͷ࠶ઃܭ 4&
ίϨΫγϣϯͷ࠶ઃܭ Ҏલͷ$PMMFDUJPO5ZQFʹඞཁͳͷ ⾣ ࠷*ݶOEFYBCMFϓϩτίϧʹ४ڌ ⾣ ඞਢͷ࣮̏ͭ // 最初のインデックス var startIndex: Index { get } // 最後の次のインデックス var endIndex: Index { get } // 指定したインデックスに該当する要素 subscript (position: Index) -> _Element { get } 4XJGUY
ίϨΫγϣϯͷ࠶ઃܭ ࠓޙͷ$PMMFDUJPOʹඞཁͳͷ ⾣ ࠷*ݶOEFYBCMF#BTFϓϩτίϧʹ४ڌ ⾣ ࠓ·ͰʹՃ͑JOEFY BGUFS ͕࣮ඞਢʹ // 最初のインデックス var startIndex: Index { get } // 最後の次のインデックス var endIndex: Index { get } // 指定したインデックスに該当する要素 subscript (position: Index) -> _Element { get } // あるインデックスの次のインデックスを取得 func index(after i: Index) -> Index 4XJGU1SFWJFX
ίϨΫγϣϯͷ࠶ઃܭ ํੑ $PMMFDUJPO͕*OEFYΛ੍ޚ *OEFYൺֱੑ͚ͩΛදݱ
ίϨΫγϣϯͷ࠶ઃܭ Ҏલͷ$PMMFDUJPO5ZQFͷํੑ ⾣ $PMMFDUJPO͕ूੵੑΛදݱ ⾣ 'PSXBSE*OEFY5ZQF #JEJSFDUJPOBM*OEFY5ZQF 3BOEPN"DDFTT*OEFY5ZQFͰҠಈੑΛදݱ // 前方移動性をもつ索引型 protocol ForwardIndexType: Equatable // 前後方移動性をもつ索引型 protocol BidirectionalIndexType: ForwardIndexType // どこへも自由に即時移動できる索引型 protocol RandomAccessIndexType: BidirectionalIndexType // コレクションは集積性と、使用する索引を規定 protocol CollectionType { associatedtype Index : ForwardIndexType 4XJGUY
ίϨΫγϣϯͷ࠶ઃܭ ࠓޙͷ$PMMFDUJPOͷํੑ ⾣ $PMMFDUJPO͕ूੵੑͱҠಈੑΛදݱ ⾣ $PMMFDUJPO #JEJSFDUJPOBM$PMMFDUJPO 3BOEPN"DDFTT$PMMFDUJPOͰ૯ׅతʹදݱ // 前方移動性をもつコレクション protocol Collection: Indexable // 前後方移動性をもつコレクション protocol BidirectionalCollection: BidirectionalIndexable // 範囲内を自由に即時移動できるコレクション protocol RandomAccessCollection: RandomAccessIndexable // インデックスに求められるのは比較性のみ protocol Collection { associatedtype Index : Comparable 4XJGU1SFWJFX
$PMMFDUJPOͷ࠶ઃܭ ࠶ઃܭͷཁ ⾣ ίϨΫγϣϯ͕ҠಈੑΛओମతʹදݱ ⾣ ࡧҾಛผࢹͤͣɺൺֱՄೳͳͰ͋Δ͜ͱ // このコレクションは前後へ移動可能 struct MyCollection : BidirectionalCollection { // 索引として文字列を使う typealias Index = String } 4XJGU1SFWJFX
$PMMFDUJPOͷ࠶ઃܭ ࠶ઃܭͷޮՌ ⾣ l࣍zͷ֓೦͕͋ΔࡧҾͷ$PMMFDUJPOෳࡶʹ ⾣ l࣍z͕$PMMFDUJPOʹґଘ͢Δ࣮؆ུԽ // Int を索引にもつデータ表現は実装の手間が増える struct MyArray<Element> : RandomAccessCollection { typealias Index = Int } // String を索引にもつデータ表現は簡略化される struct Namelist : Collection { typealias Index = String 4XJGU1SFWJFX
ΠςϨʔλʔͰͷOJMอূ 4&
ΠςϨʔλʔͰͷOJMอূ ࣍ͷ͕ͳ͍ͱ͖OJMΛଋ ⾣ ͜Ε·ͰQSFDPOEJUJPO'BJMVSFͷՄೳੑ ⾣ ࠓޙɺඞͣOJMͰද͢ݱΔํʹ "EWBODFUPUIFOFYUFMFNFOUBOESFUVSOJU PSAOJMA JGOPOFYUFMFNFOUFYJTUT 0ODFAOJMAIBTCFFOSFUVSOFE BMMTVCTFRVFOU DBMMTSFUVSOAOJMA 4XJGU1SFWJFX
#PPMFBO5ZQFϓϩτίϧͷഇࢭ 4&
#PPMFBO5ZQFϓϩτίϧͷഇࢭ ࠜڌ ⾣ ਅِͷநԽෳࡶ͞Λট͘ ⾣ ߦݱͷ"1*Ͱେ#PPMܕΛ࠾Δ ⾣ 0CK$#PPMͱ#PPMͷ૬ʹޓมՄೳ protocol BooleanType { var boolValue: Bool { get } } 4XJGUY
#PPMFBO5ZQFϓϩτίϧͷഇࢭ ഇࢭʹΑΔӨڹʢ༧ఆʣ ⾣ #PPMFBO5ZQFϓϩτίϧ͕ফ໓ ⾣ ԋࢉࢠ!, &&, ||Λ#PPMͰܕѻ͏ func && (lhs: Bool, rhs: () -> Bool) -> Bool func || (lhs: Bool, rhs: () -> Bool) -> Bool func ! (a: Bool) -> Bool 4XJGU1SFWJFX
จ๏ʹؔ͢Δมߋ
ԋࢉࢠηΫγϣϯͰͷίϝϯτ 4&
ԋࢉࢠηΫγϣϯͰͷίϝϯτͷѻ͍มߋ ֓ཁ ⾣ ίϝϯτͷҐஔͰԋࢉࢠͷղऍ͕มΘ͍ͬͯͨ ⾣ ίϝϯτΛۭനจࣈʹͯ͠ɺײతͳղऍʹ if /* comment */!isValid { ... } !͕ɺ྆ଆΛѻ͏தஔԋࢉࢠͱͯ͠ѻΘΕ͍ͯͨΒ͍͠ value +/* comment */coefficient +/*͕ɺ྆ଆΛѻ͏தஔԋࢉࢠͱͯ͠ѻΘΕ͍ͯͨΒ͍͠ 4XJGUY
ԋࢉࢠηΫγϣϯͰͷίϝϯτͷѻ͍มߋ ղऍͯ͠Β͑ͳ͘ͳΔॻࣜ ⾣ ৽ͨʹ4XJGUͰղऍͰ͖ͳ͘ͳΔͷ͕͋Δ ⾣ ίϝϯτ͕ۭനจࣈѻ͍ʹͳΔͷ͕Өڹ optionalArray/* Comment */?.count ?͕༧͍ͳ͠ظจࣈͱͯ͠ೝࣝ͞ΕΔΑ͏ʹͳΔ value+/* comment */coefficient +͕ɺޙஔԋࢉࢠͱͯ͠ѻΘΕΔΑ͏ʹͳΔ 4XJGU1SFWJFX
ҾϦετͷހׅΛඞਢʹ 4&
ҾϦετͷހׅΛඞਢʹ ֓ཁ ⾣ Ҿ͕̍ͭͰɺހׅͷলུΛෆՄʹ ⾣ ҾϦετͷॻࣜΛटඌҰ؏͢Δ func f: (Type) -> Type = { } func test() -> (Type) -> Type { } func test(f: (Type) -> Type) { } 4XJGU1SFWJFX
ҾϦετͷހׅΛඞਢʹ ΫϩʔδϟʔͷলུॻࣜͰͷހׅ ⾣ ໊લΛͯΔͷʹ͏෦ͰলུՄೳ let f: (Type) -> Bool = { value in } 4XJGU1SFWJFX
Ҿϥϕϧ໊ͷنଇΛ౷Ұ 4&
Ҿϥϕϧ໊ͷنଇΛ౷Ұ ֓ཁ ⾣ ୈ̍ҾͷಛྫΛഇࢭɺશͯͰಉ͡نଇʹ ⾣ ΨΠυϥΠϯͷϝιου໋໊نଇ͕ಈػ func something(first: Int, second: Int, third: Int) { } ◌㮫ᐠᡔҶᢡᇰӑ⍋∪ҿӶӔҹӔӍӉ something(first: 1, second: 10, third: 3) ؔɺϝιουɺΠχγϟϥΠβʔͷ શͯͷҾϥϕϧ͕ಉ͡ϧʔϧʹ౷Ұ 4XJGU1SFWJFX
Ҿϥϕϧ໊ͷنଇΛ౷Ұ ୈ̍Ҿͷϥϕϧ໊มߋՄೳ ⾣ ֎෦Ҿ໊Λఴ͑ΕมߋՄೳ ⾣ Ͱ_߸هҾϥϕϧΛলུՄೳ // ラベル名を label にする func function(label value: Int) { } ◌㮫ᐠᡔӘՑՁՓൻӼ⍋∪Ӄӵ func function(_ label value: Int) { } 4XJGU1SFWJFX
ଐੑҾͷ&RVBMΛ$PMPOʹมߋ 4&
ଐੑҾͷ&RVBMΛ$PMPOʹมߋ ֓ཁ ⾣ ଐੑҾͷΛ:Ͱද͢ݱΔ ⾣ ೖͱҧ͏Ͱ͠ΐ͏ʁͱ͍͏Ձ؍ @available(*, unavailable, renamed: "NewProtocol") typealias PreviousProtocol = NewProtocol 4XJGU1SFWJFX
ϝϯόʔࢀরͰ͑Δ༧ޠ 4&
ϝϯόʔࢀরͰ͑Δ༧ޠ ΄΅ࣗ༝ʹ༧ޠΛ༻Մೳʹ ⾣ ࢀর࣌ɺ΄΅ࣗ༝ʹ༧͕͑ޠΔ ⾣ ఆٛͰAA͕ඞཁ // 定義では `` が必要 enum DrawingStyle { case `default` case `repeat` case fit } // 使用時は `` が不要 let style = DrawingStyle.default 4XJGU1SFWJFX
ϝϯόʔࢀরͰ͑Δ༧ޠ ܕͷϝϯόʔʹ͍ͭͯಉ༷ ⾣ ϓϩύςΟϝιουͰಉ༷ // 定義では `` が必要 class Object { var `default`: Int func `repeat`(_ times: Int) -> String { … } } // 使用時は `` が不要 let object = Object() let value = object.default 4XJGU1SFWJFX
ϝϯόʔࢀরͰ͑Δ༧ޠ ༻Ͱ͖ͳ͍༧ޠ ⾣ ʹޠݴΑΔධՁ͞ΕΔޠର֎ ⾣ ͦΕΒΛ͏ͱ͖AAͰׅΔ // 定義では `` が必要 enum Evaluate { case `self` case `dynamicType` } // 使用時も `` が必要 let eval = Evaluate.`self` 4XJGU1SFWJFX
QSPUPDPM" #ΛԋࢉࢠͰදݱ 4&
QSPUPDPM" #ΛԋࢉࢠͰදݱ ϓϩτίϧͷΈ߹ΘͤΛͰදݱ ⾣ ͜Ε·ͰQSPUPDPM" #Ͱදݱ ⾣ ࠓޙ"#Ͱදݱʢ༧ఆʣ // プロトコル型で使う let p: A & B = Value() // 型引数で使う func doSomething<T: A & B>(_ value: T) { } 4XJGU1SFWJFX
-JUFSBM$POWFSUJCMFͷ໊শมߋ 4&
-JUFSBM$POWFSUJCMFͷ໊শมߋ ϓϩτίϧͷҙਤΛ໌֬Խ ⾣ $POWFSUJCMFͷҙຯ͕ෆ໌ྎ ⾣ &YQSFTTJCMF#Zʹมߋʢ༧ఆʣ 4XJGU 4XJGU &YQSFTTJCMF#Z*OUFHFS-JUFSBM *OUFHFS-JUFSBM$POWFSUJCMF &YQSFTTJCMF#Z4USJOH-JUFSBM 4USJOH-JUFSBM$POWFSUJCMF &YQSFTTJCMF#Z"SSBZ-JUFSBM "SSBZ-JUFSBM$POWFSUJCMF &YQSFTTJCMF#Z/JM-JUFSBM /JM-JUFSBM$POWFSUJCMF &YQSFTTJCMF#Z4USJOH*OUFSQPMBUJPO 4USJOH*OUFSQPMBUJPO$POWFSUJCMF ˞͔ͭزൈਮ
ԋࢉࢠΛ࣮͕ܕ 4&
ԋࢉࢠΛ࣮͕ܕ ֓ཁ ⾣ ϓϩτίϧ͕ཁ͢ٻΔԋࢉࢠΛ࣮Ͱܕʢ༧ఆʣ ⾣ ॴଐ͕໌ྎʹͳΔ struct Value : Equatable { static func == (lhs: Value, rhs: Value) -> Bool { } } 4XJGU1SFWJFX
طఆΛ࣋ͭҾͷॱংΛݻఆ 4&
طఆΛ࣋ͭҾͷॱংΛݻఆ ֓ཁ ⾣ ׳शͱ͍ͯͬͯͨ͠ฒͼସ͑Λഇࢭ ⾣ Ҿͷॱ൪"1*σβΠϯͱͯ͠ॏཁ // 既定値が指定された関数があったとき func something(a:Int = 0, b:Int = 1, c:Int = 2) { } // 異なる順番で引数を渡せなくなった something(b: 10, a: 20) FSSPSBSHVNFOUBNVTUQSFDFEFBSHVNFOUC 4XJGU1SFWJFX
!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ 4&
!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ ֓ཁ ⾣ มଐੑ͔Βܕଐੑมߋ ⾣ ܕͷੑ࣭Λత֬ʹઆ໌Ͱ͖ΔΑ͏ʹ͢Δ func function(@noescape f: () -> Int) { } XBSOJOH!OPFTDBQFJTOPXBOBUUSJCVUFPOBQBSBNFUFSUZQF JOTUFBEPGPOUIFQBSBNFUFSJUTFMG func function(@autoclosure f: () -> Int) { } 4XJGUY
!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ ৽͍͠ॻࣜ ⾣ !ʹܕOPFTDBQF!BVUPDMPTVSFΛఴ͑Δ ⾣ !OPFTDBQFͳΫϩʔδϟʔΈ͍ͨʹಡΊΔ func function(f: @noescape () -> Int) { } func function(f: @autoclosure () -> Int) { } 4XJGU1SFWJFX
!OPFTDBQF
ʹܕରͯ͠!OPFTDBQFΛఆٛ ߴ֊ؔͰҖྗΛൃش ⾣ !OPFTDBQFͳؔܕΛฦͤΔ ⾣ ͦͷ··!OPFTDBQFΛऔΔؔʹͤΔ func function(f: () -> Int) -> (@noescape (Int) -> Int) -> Int { return { g in g(f()) } } 4XJGU1SFWJFX
!BVUPDMPTVSF
ʹܕରͯ͠!BVUPDMPTVSFΛఆٛ ߴ֊ؔͰҖྗΛൃش ⾣ !BVUPDMPTVSFͳؔܕΛฦͤΔ ⾣ ͼݺग़͠ઌͰͷར༻ΛγϯϓϧʹͰ͖Δ func function() -> (@autoclosure () -> Int) -> Int { return { (f: @autoclosure () -> Int) in f() } } Ͱ࣌ݱ࠷ݶɺҾϦετͷఆ͕ٛඞཁͳ༷ࢠ // 関数で得た、関数を取る関数に、値をそのまま渡せる let f = function() let result = f(100) 4XJGU1SFWJFX
ʹܕରͯ͠JOPVUΛఆٛ 4&
ʹܕରͯ͠JOPVUΛఆٛ ֓ཁ ⾣ ϥϕϧʹఴ͍͑ͯͨJOPVUΛܕ ⾣ ϥϕϧͱJOPVU͕۠ผ͠ʹ͍ͨ͘Ί func method(inout result: Int) { } FSSPSJOPVUCFGPSFBQBSBNFUFSOBNFJTOPUBMMPXFE QMBDFJUCFGPSFUIFQBSBNFUFSUZQFJOTUFBE ՑՁՓҶ⋭ӃӵӘӒൺӂᙟ func method(inOut result: Int) { } 4XJGUY
ʹܕରͯ͠JOPVUΛఆٛ ৽͍͠ॻࣜ ⾣ ʹܕఴ͑Δ͜ͱͰϥϕϧͱ໌֬ʹ۠ผՄೳ ⾣ ͰJOPVUͰ ܕແ͍Α͏ͳؾ͢Δʁ func method(result: inout Int) { } ㋚ႁᡔൻӘፗҶՑՁՓൻӑҬӵҽӒҶᣀ⎰ func method(inOut result: inout Int) { } 4XJGU1SFWJFX
ʹܕରͯ͠JOPVUΛఆٛ ؔܕͷΓͰ͑Δ ⾣ JOPVUͳؔܕΛฦͤΔ ⾣ ͪΌΜͱJOPVUͱͯ͠ػೳ͢Δ func function() -> (result: inout Int) -> Void { return { (result: inout Int) -> Void in result = 700 } } 4XJGU1SFWJFX
ʹܕରͯ͠JOPVUΛఆٛ ؔܕͷมͰ͑Δ ⾣ ؔܕͷมͰJOPVU͕Մೳ ⾣ ͍ํීஈͷͱ͓Γ let f: (inout Int) -> Void = { return { $0 = 5000 } } 4XJGU1SFWJFX
JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ 4&
JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ ֓ཁ ⾣ JOPVUมͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ ⾣ ಡΈऔΓઐ༻ͱͯ͠໌ࣔΩϟϓνϟՄೳ func something(value: inout Int) { let noescaped: @noescape () -> Void = { value = 10 } let escaped: () -> Void = { [value] in print(value) ಡΈऔΓઐ༻ͱͯ͠ } ΩϟϓνϟՄೳ } 4XJGU1SFWJFX
σόοάࣝผࢠͷมߋ 4& 4&
σόοάࣝผࢠͷϞμϯԽͱᐆດੑͷղফ ֓ཁ ⾣ Ͱ࢝·ΔখจࣈͷΩϟϝϧέʔεʹมߋ ⾣ ࠓ·Ͱ@@ͰׅΒΕͨεωʔΫέʔε 4XJGU 4XJGU ༻్ pMF @@'*-&@@ ϑΝΠϧ໊ MJOF @@-*/&@@ ߦ൪߸ DPMVNO @@$0-6./@@ จࣈ൪߸ GVODUJPO @@'6/$5*0/@@ ໊ؔ TPVSDF-PDBUJPO MJOF Ґஔใͷมߋ ETPIBOEMF @@%40@)"/%-&@@ %40ϋϯυϧ
σόοάࣝผࢠͷϞμϯԽͱᐆດੑͷղফ ະ࣮ͷࣝผࢠ ⾣ ϓϩϙʔβϧʹ͞ࡌهΕ͍ͯΔ ⾣ 4XJGU1SFWJFXͰఏ͞ڙΕ͍ͯͳ͍ 4XJGU ༻్ pMFOBNF ύεΛ͍ͳ·ؚϑΝΠϧ໊ TZNCPM ໊લۭؒҾΛؚΉγϯϘϧ໊
จ๏ʹؔ͢ΔՃ
δΣωϦοΫͳܕΤΠϦΞε 4&
δΣωϦοΫͳܕΤΠϦΞε ֓ཁ ⾣ ܕΤΠϦΞεͰδΣωϦοΫܕΛ༻Մೳ typealias NamedValues<T> = Dictionary<String, T> typealias Vector<T> = (T, T) typealias Filter<T,R> = (T) -> R 4XJGU1SFWJFX
DBTFͰͷෳύλʔϯϚον 4&
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
ͻͱ·ͣɺ͜͜·Ͱ
4XJGUͷ৽ػೳ ͻͱ·ͣɺ͓͠·͍ 4&4XJGU"1*ΨΠυϥΠϯ 4&໋໊نଇͷΨΠυϥΠϯͷద༻ 4&"1*ͷΨΠυϥΠϯద༻ 4&ΓΛΘͳ͍ͱʹࠂܯ 4&*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ 4&খϓϩτίϧ 4&'PVOEBUJPOͷܕ 4&OJMϙΠϯλʔදݱ 4&ίϨΫγϣϯͷ࠶ઃܭ
4XJGUͷ৽ػೳ ͻͱ·ͣɺ͓͠·͍ 4&ΠςϨʔλʔͰͷOJMอূ 4&#PPMFBO5ZQFϓϩτίϧͷഇࢭ 4&ԋࢉࢠηΫγϣϯͰͷίϝϯτ 4&ҾϦετͷހׅΛඞਢʹ 4&Ҿϥϕϧ໊ͷنଇΛ౷Ұ 4&ଐੑҾͷ&RVBMΛ$PMPOʹมߋ 4&ϝϯόʔࢀরͰ͑Δ༧ޠ 4&QSPUPDPM" #ΛԋࢉࢠͰදݱ 4&-JUFSBM$POWFSUJCMFͷ໊শมߋ
4XJGUͷ৽ػೳ ͻͱ·ͣɺ͓͠·͍ 4&ԋࢉࢠΛ࣮͕ܕ 4&طఆΛ࣋ͭҾͷॱংΛݻఆ 4&!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ 4&ʹܕରͯ͠JOPVUΛఆٛ 4&JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ 4&σόοάࣝผࢠͷมߋ 4&MJOFࣝผࢠͷᐆດੑղফ 4&δΣωϦοΫͳܕΤΠϦΞε 4&DBTFͰͷෳύλʔϯϚον