138 Views
August 01, 16
スライド概要
Swift 3.0 で変わったところから、興味の湧いた 13 項目を、自分が開催する "カジュアル Swift 勉強会" の紹介も兼ねつつ、Swift 愛好会で発表してきました。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 2,196 でした。
少し前に iPhone Dev Sapporo 勉強会で話した内容から、項目数は減らしつつも、新たな項目を紹介したり、紹介済みの項目についても内容を少し膨らませたりしています。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
4XJGU ͰมΘͬͨͱ͜Ζ ΧδϡΞϧ4XJGUษڧձͷΈΜͳ͕ ͖ͦ͏ͳ߲ʹߜͬͯհʜʂ /* ू·Ε4XJGU͖ʂ4XJGUѪձWPM */ &;/&5۽୩༑ 4XJGU%FWFMPQFS1SFWJFX 9DPEFCFUB IUUQF[OFUKQ
۽୩༑ /* @es_kumagai */ 5PNPIJSP,VNBHBJ /** */ ⾣ 4XJGU͕ޠݴେ͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษڧձ͕େ͖Ͱ͢ʂ ⾣ ษڧձͰൃද͢Δͷ͕ͱ͖ͬͯͰ͢ʂ ⾣ ॻ੶9DPEFపఈղઆॻ͖·ͨ͠ɻ ⾣ ٕज़ϒϩά&;/&5Λॻ͍ͨΓͯ͠·͢ɻ
ษڧձΛ։࠵ͯ͠·͢ɻ ԣJ1IPOF։ൃऀษڧձ ΧδϡΞϧ4XJGUษڧձ ZJEFW ˏԣɾഅंಓ DTXJGU !ԣɾ੨༿ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕తͷձ ΏΔ͘ΈΜͳͰ4XJGU͍ͯͭʹޠݴ ޠΒ͑Δ͕ཉͯ࢝͘͠Ίͨձ ୈճ݄ͷ։࠵Λඪ ୈճɺ݄̔Լ०্͔݄̕०Λඪ
ΧδϡΞϧ4XJGUษڧձ DTXJGU !ԣɾ੨༿
ΧδϡΞϧ4XJGUษڧձ త 4XJGUʹ͍ͭͯޠΒ͑Δॴ ஊস͠ͳ͕ΒֶͼΛਂΊΔ ͔͔ͤͬͩ͘Βָ͋͘͠Γ͍ͨ
ΧδϡΞϧ4XJGUษڧձ ৺ߏ͑ ΈΜͳͷҙ͕ݟਖ਼͍͠ ΈΜͳͬͯΔɺࢥ͍ࠐΈ DTXJGU
4XJGU XJMMCFSFMFBTFETPNFUJNFJOMBUF
ͦΖͦΖ4XJGUΛ Ѳ͓͖͍ͯͨ͠ʜʂ
4XJGU֓ཁ
4XJGU τοϓχϡʔε ⾣ ͷޙʹϦϦʔε ⾣ 4XJGU͔Βͷഁյతͳ༷มߋ
4XJGU ඪ ⾣ 4XJGUޠݴΛ֬ఆɾख़ͤ͞Δ ⾣ 4XJGUҎ߱Ͱͷιʔείʔυͷ ޓੑΛࢦ͢ʢྗඪʣ ⾣ 4XJGUҎ߱ͷιʔεޓഁյ ࠷খݶͷӨͰڹͷ࣮ݱΛࢦ͢
4XJGU ཁ ⾣ ৽͍͠"1*ΨΠυϥΠϯ ⾣ ༷ޠݴΛચ࿅ ⾣ 0CKFDUJWF$$ͷίʔυΛ 4XJGUจԽʹ߹Θͤͯऔࠐ ⾣ ίϯύΠϥ*%&ͷ্࣭ ⾣ 4XJGUύοέʔδϚωʔδϟʔ
4XJGU ண ޠݴͷ҆ఆԽΛਤΓ ଞڥͷҠ২ੑΛݟਾ͑Δ
4XJGUͰมΘͬͨͱ͜Ζ ଟ͗͢ΔͷͰɺΧδϡΞϧ4XJGUษڧձͷΈΜͳ͕ ͖ͦ͏ͳʹߜͬͯհͯ͠ΈΔ
4XJGU ͰมΘͬͨͱ͜Ζ "1*%FTJHO(VJEFMJOFT 4&4XJGU"1*ΨΠυϥΠϯ 4&໋໊نଇͷΨΠυϥΠϯͷద༻ 4&ඪ४ϥΠϒϥϦͷద༻ 4&'PVOEBUJPOͷద༻ ࢥޠݴʹؔ͢Δมߋ 4&ΓΛΘͳ͍ͱʹࠂܯ 4&*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ 4&খϓϩτίϧ
4XJGU ͰมΘͬͨͱ͜Ζ ࢥޠݴʹؔ͢Δมߋ 4&'PVOEBUJPOͷܕ 4&OJMϙΠϯλʔදݱ 4&ίϨΫγϣϯͷ࠶ઃܭ 4&ΠςϨʔλʔͰͷOJMอূ 4&#PPMFBO5ZQFϓϩτίϧͷഇࢭ จ๏ʹؔ͢Δมߋ 4&ԋࢉࢠηΫγϣϯͰͷίϝϯτ 4&ҾϦετͷހׅΛඞਢʹ
4XJGU ͰมΘͬͨͱ͜Ζ จ๏ʹؔ͢Δมߋ 4&Ҿϥϕϧ໊ͷنଇΛ౷Ұ 4&ଐੑҾͷ&RVBMΛ$PMPOʹมߋ 4&ϝϯόʔࢀরͰ͑Δ༧ޠ 4&ྻͰܕڍͷྻࢠڍදه 4&طఆΛ࣋ͭҾͷॱংΛݻఆ ϓϩτίϧදؔ͢ʹهΔมߋ 4&QSPUPDPM" #ΛԋࢉࢠͰදݱ 4&-JUFSBM$POWFSUJCMFͷ໊শมߋ
4XJGU ͰมΘͬͨͱ͜Ζ ؔ͢ʹܕΔมߋ 4&ԋࢉࢠΛ࣮͕ܕ 4&!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ 4&ʹܕରͯ͠JOPVUΛఆٛ 4&JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ 4&6ONBOBHFE4XJGUϙΠϯλΛѻ͏ ߏޠݴจͷআ 4&$ελΠϧGPSϧʔϓͷআ 4&ԋࢉࢠ ͱͷআ
4XJGU ͰมΘͬͨͱ͜Ζ ߏޠݴจͷআ 4&ΧϦʔԽؔߏจͷআ 4&ҾϦετ͔ΒWBSΛআ 4&ҾϦετ͔ΒMFUΛআ 4&λϓϧεϓϥοτͷഇࢭ จ๏ʹؔ͢ΔػೳՃ 4&δΣωϦοΫͳܕΤΠϦΞε 4&DBTFͰͷෳύλʔϯϚον
4XJGU ͰมΘͬͨͱ͜Ζ ؔ͢ʹܕΔػೳՃ 4&γʔέϯε͔ΒཁૉΛ͚ͯͭݟऔಘ 4&γʔέϯεΛ࡞Δؔ 4&0QUJPOBM͚GMBU.BQΛԆՄೳʹ 4&4MJDF͔ΒݩͷγʔέϯεΛࢀর ࣮ߦؔ͢ʹڥΔมߋ 4&σόοάࣝผࢠͷϞμϯԽ 4&MJOFࣝผࢠͷᐆດੑΛղফ 4&1MBZHSPVOEϦςϥϧͷϞμϯԽ
ࢥޠݴʹؔ͢Δมߋ
ΓΛΘͳ͍ͱʹࠂܯ 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
ΓΛΘͳ͍ͱʹࠂܯ !XBSO@VOVTFE@SFTVMU͑ͳ͍ ⾣ !XBSO@VOVTFE@SFTVMU͑ͳ͍ ⾣ NVUBCMF@WBSJBOUͱNFTTBHF υΩϡϝϯτίϝϯτͰରԠʢະ࣮ʣ /// MutatingCounterpart: xxxx /// MonmutatingCounterpart: xxxx func makeFilter() -> Filter {…} 4XJGU1SFWJFX
4&ΓΛΘͳ͍ͱʹࠂܯ ײ ϝιουఆٛͷෛ୲͕͔ͳΓܰ͞ݮΕͦ͏ ࡞Δଆ͕Կߟ͑ͳͯ͘ɺࠂܯѻ͍ʹͳΔͷ͕ྑ͍ʂ
খϓϩτίϧ 4&
খϓϩτίϧ ϓϩτίϧઃܭͷௐ ⾣ େখൺֱՄೳ ⾣ খϦςϥϧʹରԠ ⾣ ༨ԋࢉࢠͷഇࢭ ⾣ جຊతͳఆͷఏڙ ⾣ 'MPBU'͕ܕMPBUJOH1PJOUʹ४ڌ
খϓϩτίϧ 'MPBUJOH1PJOUϓϩτίϧ ⾣ ҎલɺมΠχγϟϥΠβͱঢ়گఆɺ ಛघঢ়ଶʢ㱣 /B/ Λࣔ͢ϓϩύςΟͷΈ ⾣ ੜɺԋࢉɺఆͳͲͷػೳΛՃ ߲ ༻్ *OUFHFS-JUFSBM$POWFSUJCMF ϦςϥϧʹରԠ JOJU TJHOFYQPOFOUTJHOJpDBOE ෆಈখͰͷॳظԽ TUBUJDWBSSBEJY ج TUBUJDWBSQJ ԁप WBSVNQ ࣍ʹදݱՄೳͳͱͷࠩ ˞͔ͭزൈਮ
খϓϩτίϧ #JOBSZ'MPBUJOH1PJOUϓϩτίϧ ⾣ ͕̎جͷුಈখදݱ ⾣ 'MPBUJOH1PJOUϓϩτίϧΛܧঝ ⾣ ϏοτύλʔϯʹΑΔૢ࡞ΛՃ ߲ ༻్ 3BX4JHOJpDBOE Ծද͠ͳ߸ූ͏Ͱݱܕ 3BX&YQPOFOU ࢦද͠ͳ߸ූ͏Ͱݱܕ TUBUJDWBSTJHOJGJDBOE#JU$PVOU Ծද͑ͰݱΔϏοτ WBSTJHOJpDBOE#JU1BUUFSO ԾΛද͢ݱΔϏοτύλʔϯ WBSCJOBEF ̎جΛࢦ෦Ͱྦྷͨ͠ ˞͔ͭزൈਮ
খϓϩτίϧ
ԋࢉʹରԠ
⾣ ϓϩτίϧ͕ࣗԋࢉʹରԠ
⾣ ࢛ଇԋࢉɺେখൺֱ
func add<T: FloatingPoint>(lhs: T, rhs: T) -> T {
return lhs + rhs
}
۩ମతͳܕΛఆ͠ͳͯ͘ԋࢉՄೳʹ
4XJGU1SFWJFX
4&খϓϩτίϧ ײ ුಈখΛ֓೦ͱͯ͠ѻ͑Δͷ͕ྑͦ͞͏ ඪ४ϥΠϒϥϦʹͯ͘͠͠Εͨϓϩτίϧͳҹ
'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*%
4&'PVOEBUJPOͷܕ ײ ࢀরͱܕܕΛϒϦοδͰӡ༻͢Δͷ͕Έ ඪ४ϥΠϒϥϦͰͳ͘'PVOEBUJPOͰఆ͍ٛͯͯ͠ڵຯਂ͍
ΠςϨʔλʔͰͷOJMอূ 4&
ΠςϨʔλʔͰͷ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
4&ΠςϨʔλʔͰͷOJMอূ ײ ํͱͯ͠ྫ֎͕আ͔Εͨͷ͍͠خ ίϝϯτͷमਖ਼͚ͩͰͳ͘͠خΕΔͷɺ͓͠Ζ͍
#PPMFBO5ZQFϓϩτίϧͷഇࢭ 4&
#PPMFBO5ZQFϓϩτίϧͷഇࢭ ࠜڌ ⾣ ਅِͷநԽෳࡶ͞Λট͘ ⾣ ߦݱͷ"1*Ͱେ#PPMܕΛ࠾Δ ⾣ 0CK$#PPMͱ#PPMͷ૬ʹޓมՄೳ protocol BooleanType { var boolValue: Bool { get } } 4XJGUY
'PVOEBUJPOͷܕ
நԽΛҙࣝ͢Δ͜ͱʹΑΔෳࡶԽ
⾣ #PPMͰͳ͘#PPMFBO5ZQFΛ͏
⾣ ͜ͷॻ͖ํʹͲΕ͘Β͍Ձ͕͋ΔͩΖ͏͔ʁ
func remove<T:BooleanType>(recursively flag: T) {
…
}
func isKindOf<R:BooleanType>(type: AnyType) -> R {
…
}
4XJGUY
'PVOEBUJPOͷܕ ݅Ͱذඒ͍͑ͯͨ͘͠ʜ ⾣ JGHVBSE#PPMFBO5ZQFʹରԠ ⾣ ͜ͷ߹ඒ͘͠ػೳ͢Δ struct Condition : BooleanType { … } let condition = Condition(…) if condition { … ҎલɺεϚʔτʹൺֱՄೳͩͬͨ } 4XJGUY
#PPMFBO5ZQFϓϩτίϧͷഇࢭ ഇࢭʹΑΔӨڹʢ༧ఆʣ ⾣ #PPMFBO5ZQFϓϩτίϧ͕ফ໓ ⾣ ԋࢉࢠ!, &&, ||Λ#PPMͰܕѻ͏ func && (lhs: Bool, rhs: () -> Bool) -> Bool func || (lhs: Bool, rhs: () -> Bool) -> Bool func ! (a: Bool) -> Bool 4XJGU1SFWJFX
4&#PPMFBO5ZQFϓϩτίϧͷഇࢭ ײ ϓϩτίϧഇࢭͰશମ͕γϯϓϧʹͳΓͦ͏ நԽͷඞཁੑΛߟ͑Δͱ͖ͷɺྑ͍ࢀߟʹͳΓͦ͏
จ๏ʹؔ͢Δมߋ
ϝϯόʔࢀরͰ͑Δ༧ޠ 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
4&ϝϯόʔࢀরͰ͑Δ༧ޠ ײ ΄ͱΜͲͷ༧ී͕ޠ௨ʹ͍͑ͯ͠خ ಛʹEFGBVMU͕ͦͷ··ॻ͚Δޭେ͖ͦ͏
ϓϩτίϧදؔ͢ʹهΔมߋ
QSPUPDPM" #ΛԋࢉࢠͰදݱ 4&
QSPUPDPM" #ΛԋࢉࢠͰදݱ ϓϩτίϧͷΈ߹ΘͤΛͰදݱ ⾣ ͜Ε·ͰQSPUPDPM" #Ͱදݱ ⾣ ࠓޙ"#Ͱදݱʢ༧ఆʣ // プロトコル型で使う let p: A & B = Value() // 型引数で使う func doSomething<T: A & B>(_ value: T) { } 4XJGU1SFWJFX
4&QSPUPDPM" #ΛԋࢉࢠͰදݱ ײ ͍͠خΑ͏ͳɺ͍͘ʹݟΑ͏ͳ ैલͷํ͕໘͚ͩͲɺ͔Γ͍͢ʁ׳Εͷʁ
ؔ͢ʹܕΔมߋ
ԋࢉࢠΛ࣮͕ܕ 4&
ԋࢉࢠΛ࣮͕ܕ ֓ཁ ⾣ ϓϩτίϧ͕ཁ͢ٻΔԋࢉࢠΛ࣮Ͱܕʢ༧ఆʣ ⾣ ॴଐ͢Δͳʹྎ໌͕ܕΔ struct Value : Equatable { static func == (lhs: Value, rhs: Value) -> Bool { } } 4XJGU1SFWJFX
ԋࢉࢠΛ࣮͕ܕ
ΦϒδΣΫτࢦͱͷ૬ੑʁ
⾣ ܧঝΛߟྀ͢Δͱɺϝιου͕ඞཁʹͳΔ
⾣ ΦϒδΣΫτࢦతʹࣗવͳ࣮
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
ԋࢉࢠΛ࣮͕ܕ ΦϒδΣΫτࢦͱͷ૬ੑʁ ⾣ ੩తϝιουܧঝͰ͖Δ ⾣ ൺֱ࣌ʹܧঝΛՃຯͯ͘͠ΕΔͩΖ͏͔ʁ class Base : Equatable { class func == (lhs: Base, rhs: Base) -> Bool {…} } class Sub : Base { override class func == (lhs: Base, rhs: Base) -> Bool {…} } 4XJGU1SFWJFX
4&ԋࢉࢠΛ࣮͕ܕ ײ ࠷ॳʹͱͬͯࠞཚͨ͠ͱ͜Ζʂྑ͍ʂ ΦϒδΣΫτࢦͱͷ૬ੑґવɺΠϚΠν͔͠Εͳ͍
JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ 4&
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
JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ ΫϩʔδϟʔͷੜଘൣғΛ੍ݶ ⾣ JOPVUมͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ ⾣ ಡΈऔΓઐ༻ʢෳʣͳΒɺΩϟϓνϟՄೳ func something(value: inout Int) { let noescaped: @noescape () -> Void = { value = 10 } let escaped: () -> Void = { [value] in print(value) ಡΈऔΓઐ༻ͱͯ͠ } ΩϟϓνϟՄೳ } 4XJGU1SFWJFX
4&JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ ײ ߟ͑ͨ͜ͱͳ͔ͬͨɺྑ͍ 8SJUFCBDLͷΈͱΩϟϓνϟ͔֬ʹ૬ੑѱͦ͏
ߏޠݴจͷআ
λϓϧεϓϥοτͷഇࢭ 4&
λϓϧεϓϥοτͷഇࢭ λϓϧεϓϥοτͱ ⾣ ҾϦετͱͯ͠λϓϧΛͤΔ ⾣ ϥϕϧ໊ͱొॱҰக͢Δඞཁ͋Γ func total(price: Int, count: Int) -> Int { } // 引数リストを丸ごとタプルで扱える let item: (Int, count: Int) = (100, 5) total(item) 4XJGU
λϓϧεϓϥοτͷഇࢭ λϓϧεϓϥοτߏจͷআ ⾣ ݪଇɺҾϦετʹλϓϧΛͤͳ͘͢Δ ⾣ Φʔόʔϩʔυͱצҧ͍͍ͨ͢͠Ί ⾣ λΠϓνΣοΧʔʹͱͬͯߴෛՙͳͨΊ func total(price: Int, count: Int) -> Int { } // 原則、引数リストを1つのタプルで表現できない let item: (Int, count: Int) = (100, 5) total(item) FSSPSNJTTJOHBSHVNFOUGPSQBSBNFUFSDPVOUJODBMM 4XJGU1SFWJFX
λϓϧεϓϥοτͷഇࢭ
δΣωϦοΫͰࣅͨॻ͖ํՄೳ
⾣ ͻͱͭͷܕҾͰɺෳͷҾΛѻ͏
⾣ ͨͩ͠ɺؔΛ͢ͱ͖ʹݶΔ
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
4&λϓϧεϓϥοτͷഇࢭ ײ ڵຯਂ͍ػೳ͚ͩΕͲແͯ͘ྑ͍͕͢ؾΔ δΣωϦοΫͷྨࣅػೳͰॆ࣮༻తͳҹ
จ๏ʹؔ͢ΔػೳՃ
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
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
4&DBTFͰͷෳύλʔϯϚον ײ ෳͷ݅Ͱಉ͡ॲཧΛهड़Ͱ͖ͯศར ͜ΕͰGBMMUISPVHIΛ͏໘͕΄ͱΜͲͳ͘ͳΓͦ͏ʂ
γʔέϯεΛ࡞Δؔ 4&
γʔέϯεΛ࡞Δؔ ॳظ͔ΒγʔέϯεΛ࡞Δ ⾣ 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
γʔέϯεΛ࡞Δؔ ॳظঢ়ଶ͔ΒγʔέϯεΛ࡞Δ ⾣ 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
4&γʔέϯεΛ࡞Δؔ ײ ҙͷγʔέϯεΛ؆୯ʹ࡞Ε͍ͯ͠خ ಛʹऴͷͳ͍γʔέϯεΛ࡞Δͷʹ͍͍ͯΔͣ
4MJDF͔ΒݩͷγʔέϯεΛࢀর 4&
4MJDF͔ΒݩͷγʔέϯεΛࢀর ֓ཁ ⾣ ֤छ4MJDFʹܕCBTFϓϩύςΟΛ࣋ͨͤΔ ⾣ TVCTDSJQUͷॻ͖ࠐΈ࣮Λγϯϓϧʹ͢Δʁ ҙਤ͍ͯ͠Δૂ͍͕ɺ·ͩ௫Ίͳ͍ʜ struct MutableSlice<Base : MutableIndexable> { var base: Base { get } } 4XJGU1SFWJFX
4MJDF͔ΒݩͷγʔέϯεΛࢀর CBTFΛͳʹؾ͍ͯͯ͠؍Δ ⾣ ϓϩτίϧͰطఆ͞Ε͍ͯͳ͍ ⾣ ʹܕ࣮͞Ε͍ͯΔ ⾣ ⾣ w ༷ʑͳ4MJDF࣮͞ʹܕΕ͍ͯΔ w "SSBZ4MJDFʹ࣮͞Ε͍ͯͳ͍ εϥΠεΛॻ͖͖ͱͨ͑ʜ w ݩͷ༰ॻ͖มΘΒͳ͍ w CBTF͕ࢦ͢ɺݩͷෳॻ͖ΘΔ ͷ࣮ΛݟΔݶΓͰɺ w TVCTDSJQUͷ࣮ʹCBTFͬͯͳͦ͞͏ w @XSJUF#BDL.VUBCMF4MJDFؔΛ͍ͬͯΔ 4XJGU1SFWJFX
4&4MJDF͔ΒݩͷγʔέϯεΛࢀর ײ ࣝෆʹΑΓҙਤ͕௫Ίͣʜ ͱΓ͋͑ͣCBTF෦తʹΘΕΔͷʁ
ࠓճɺ͜͜·Ͱ
4XJGU ͰมΘͬͨͱ͜Ζ "1*%FTJHO(VJEFMJOFT 4&4XJGU"1*ΨΠυϥΠϯ 4&໋໊نଇͷΨΠυϥΠϯͷద༻ 4&ඪ४ϥΠϒϥϦͷద༻ 4&'PVOEBUJPOͷద༻ ࢥޠݴʹؔ͢Δมߋ 4&ΓΛΘͳ͍ͱʹࠂܯ 4&*NQMJDJUMZ6OXSBQQFE0QUJPOBMഇࢭ 4&খϓϩτίϧ
4XJGU ͰมΘͬͨͱ͜Ζ ࢥޠݴʹؔ͢Δมߋ 4&'PVOEBUJPOͷܕ 4&OJMϙΠϯλʔදݱ 4&ίϨΫγϣϯͷ࠶ઃܭ 4&ΠςϨʔλʔͰͷOJMอূ 4&#PPMFBO5ZQFϓϩτίϧͷഇࢭ จ๏ʹؔ͢Δมߋ 4&ԋࢉࢠηΫγϣϯͰͷίϝϯτ 4&ҾϦετͷހׅΛඞਢʹ
4XJGU ͰมΘͬͨͱ͜Ζ จ๏ʹؔ͢Δมߋ 4&Ҿϥϕϧ໊ͷنଇΛ౷Ұ 4&ଐੑҾͷ&RVBMΛ$PMPOʹมߋ 4&ϝϯόʔࢀরͰ͑Δ༧ޠ 4&ྻͰܕڍͷྻࢠڍදه 4&طఆΛ࣋ͭҾͷॱংΛݻఆ ϓϩτίϧදؔ͢ʹهΔมߋ 4&QSPUPDPM" #ΛԋࢉࢠͰදݱ 4&-JUFSBM$POWFSUJCMFͷ໊শมߋ
4XJGU ͰมΘͬͨͱ͜Ζ ؔ͢ʹܕΔมߋ 4&ԋࢉࢠΛ࣮͕ܕ 4&!OPFTDBQFͱ!BVUPDMPTVSFΛҠಈ 4&ʹܕରͯ͠JOPVUΛఆٛ 4&JOPVUͷΩϟϓνϟΛ!OPFTDBQFʹ੍ݶ 4&6ONBOBHFE4XJGUϙΠϯλΛѻ͏ ߏޠݴจͷআ 4&$ελΠϧGPSϧʔϓͷআ 4&ԋࢉࢠ ͱͷআ
4XJGU ͰมΘͬͨͱ͜Ζ ߏޠݴจͷআ 4&ΧϦʔԽؔߏจͷআ 4&ҾϦετ͔ΒWBSΛআ 4&ҾϦετ͔ΒMFUΛআ 4&λϓϧεϓϥοτͷഇࢭ จ๏ʹؔ͢ΔػೳՃ 4&δΣωϦοΫͳܕΤΠϦΞε 4&DBTFͰͷෳύλʔϯϚον
4XJGU ͰมΘͬͨͱ͜Ζ ؔ͢ʹܕΔػೳՃ 4&γʔέϯε͔ΒཁૉΛ͚ͯͭݟऔಘ 4&γʔέϯεΛ࡞Δؔ 4&0QUJPOBM͚GMBU.BQΛԆՄೳʹ 4&4MJDF͔ΒݩͷγʔέϯεΛࢀর ࣮ߦؔ͢ʹڥΔมߋ 4&σόοάࣝผࢠͷϞμϯԽ 4&MJOFࣝผࢠͷᐆດੑΛղফ 4&1MBZHSPVOEϦςϥϧͷϞμϯԽ
Enjoy! Swift /* Thank you */