124 Views
July 09, 16
スライド概要
WWDC16 の Swift ラボで聞いてきた話から2つをピックアップして、第68回 Cocoa 勉強会関西 で紹介してきました。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 1,416 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
4XJGU0QFO)PVST %FWFMPQFS5PPMT-BC" !88%$ /* 2016.07.09 @ 第68回 Cocoa 勉強会関西 */ &;/&5۽୩༑ 4XJGU1SFWJFX IUUQF[OFUKQ
۽୩༑ /* @es_kumagai */ 5PNPIJSP,VNBHBJ /** */ ⾣ 4XJGU͕ޠݴେ͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษڧձ͕େ͖Ͱ͢ʂ ⾣ ษڧձͰൃද͢Δͷ͕ͱ͖ͬͯͰ͢ʂ ⾣ ॻ੶9DPEFపఈղઆॻ͖·ͨ͠ɻ ⾣ ٕज़ϒϩά&;/&5Λॻ͍ͨΓͯ͠·͢ɻ
ษڧձΛ։࠵ͯ͠·͢ɻ ԣJ1IPOF։ൃऀษڧձ ΧδϡΞϧ4XJGUษڧձ ZJEFW ˏԣɾഅंಓ DTXJGU !ԣɾ੨༿ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕తͷձ ΏΔ͘ΈΜͳͰ4XJGU͍ͯͭʹޠݴ ޠΒ͑Δ͕ཉͯ࢝͘͠Ίͨձ ୈ̍̌ճ։࠵༧ఆ /** ͍ئ J044XJGUͷษڧձΛ։࠵ͯ͠·͢ɻ ҆৺ͯ͠ஊٛʹՖΛ࡙͔ͤΒΕ·͢Α͏ʹɻ */
@niwatako͞Μʹ ໋ΛٹΘΕͨ
Ή͔͠Ή͔͠ɺւͷ͜͏Ͱ
8 8 %$ /* 2016/06/13 2016/06/17 */ ͱ͍͏ɺ͍ͨͦ͏͓ߴ͍ Πϕϯτ͕ܭը͞Ε͍ͯͨͦ͏ͳ
ӈ্ʹ͋ͬͨ3FHJTUFSϘλϯΛɺ ԡͯ͠ΈΔͱ
ͳΜͱɺ ܾࡁ͞Εͨ͡Όͳ͍Ͱ͔͢
͜͏ͯ͠ࢲɺ 4BO'SBODJTDPෝ͘͜ͱʹͳͬͨͷͰ͢
͔͠͠
ࢲʹͱͬͯɺॳͷւ֎
ւ֎ߦͬͨΒ ੜ͖ͯͯͬ͜ؼΕΔ͍ͳ͕͠ؾ
Ͱɺʹޙ͏Ҿ͚·ͤΜ
༻ҙप౸ʹ४උΛਐΊʜ ग़ൃલͷ༷ࢠ ߤ࿏ͱ ॓ധͷܾఆ ӳޠ ӳֶޠश Ͱ͖ͳ͍ ·ͩʂ ݥةଳͷ ༧श ਐḿθϩʂ Φϫλ ʘ ?P? ʗ ඞཁͳ࣋ ͷ४උ ՙΓ 4XJGUֶश ΧδϡΞϧ 4XJGUษڧձ ଟ͍ʂ ؒʹ߹Θͳ͍ʂ ग़ൃલʹ ษڧձΛ։࠵ʂ
ւ֎ରԠ4*.Λ࣋ͬͯɺߤ
౸ண ͔͠͠
·͔͞ͷɺ֎ݍ Ͳ͏͕͍͕͋ͯܨΓ·ͤΜ
ਓੜɺఘΊ͔͚ͨͦͷॠؒ
ਆɺ߱ྟ
࣮ཁΒͳ͔͚ͬͨͲɺʹ͍࣌ͨؾΩϟϯηϧྉ͔ͩͬͨΒआΓ͖ͯͨ 8J'JϧʔλʔΛ̍ɺत͚·͠ΐ͏
͜͏ͯ͠ࢲɺҟࠃͷͰ ੜ͖Β͑Δ͜ͱ͕Ͱ͖·ͨ͠
!OJXBUBLP ͞Μ ਆ
͔͠͠ɺ҆৺͍ͯ͠ΒΕ·ͤΜ ໌ʹฦ͞ͳ͚Ε͍͚ͳ͍ͷͰ͢
ݱͰ4*.Λௐୡ͠Α͏
͚ΕͲෆཱ͕͔҆ͪͩΓ·͢ ӳޠΛΕͳͯ͘ങ͑Δͷ͔ɺͱ
ళΛ͚ͭݟɺೖΕ͙͢͞·ళһ͞Μ͕ʜ ɺશෆՄආ
ࢲ ళһ ˓˞˛ʁ˖– ʜ4*. 0,˞˛ʂ˕– ࡏΛฉ͍͍ͯΔΑ͏ͩʜ ʜEBZT 0,˚˞ˑ˓˘ ͜ͷϓϥϯͰྑ͍͔ฉ͍͍ͯΔΑ͏ͩʜ ʜ1MFBTF 0, ʜ5IBOLZPV
͍͍ͷ͔ʁ͜ΕͰʜ
͜͏ͯ͠ɺແࣄʹ4*.ΛखʹೖΕ 8J'JϧʔλʔΛฦ͢͜ͱ͕Ͱ͖·ͨ͠ͱ͞
ΊͰͨ͠ΊͰͨ͠
8 8 %$ /* 2016/06/13 2016/06/17 */
88%$ ͍ͪΜָ͠Έʹ͍ͯͨ͠ηογϣϯ
͍ͪΜָ͠Έʹ͍ͯͨ͠ηογϣϯ 8IBU`T/FXJO4XJGU
88%$ ͍ͪΜָ͔ͬͨ͜͠ͱ
%FWFMPQFS5PPMT-BC" 4XJGU0QFO)PVST
4XJGU0QFO)PVST ϥϘͰ࣭ͨ͜͠ͱ ྻ͕ࢠڍ-PXFS$BNFM$BTFʹͳͬͨ۩ମతͳཧ༝ʁ !TXJGU@NJHSBUJPOଐੑͷ͍ํΛΓ͍ͨ *60ଐੑೖΕࢠʹͰ͖ͳ͍ͣͳͷʹ ೖΕࢠʹͰ͖Δ߹͕͋Δͷͳͥʁ $PMMFDUJPOͰJOEFY BGUFS ͕ඞਢʹͳͬͨཧ༝ʁ TPVSDF-PDBUJPOͱpMF࿈ಈ͠ͳ͍ͷʁ ETPIBOEMF࣮ߦ࣌ΤϥʔʹͳΔ͕ɺͲ͏͏ͷ͔ ͳͥEFGFSͰએݴલͷม͕͑Δͷ͔ !DPOWFOUJPOͷ༻్Λ͏গ͠ৄ͘͠Γ͍ͨ ධՁࣜʹର͢ΔTFMGͲ͏͍͏ޮՌ͕͋Δͷ͔ ʹܕର͢ΔTFMGΛলུͰ͖Δ߹͕͋Δͷͳͥʁ !XBSO@VOVTFE@SFTVMU͕1MBZHSPVOEͰޮ͔ͳ͍ཧ༝ʁ
4XJGU0QFO)PVST ͦ͜ͰਘͶͨ͜ͱΛ̎ͭհ
$PMMFDUJPOͰJOEFY BGUFS ͕ ඞਢʹͳͬͨཧ༝
$PMMFDUJPO͕ཁ͢ٻΔͷ 4XJGUͰ$PMMFDUJPO5ZQFΛద༻ ⾣ ࠷*ݶOEFYBCMFϓϩτίϧʹ४ڌ ⾣ ඞਢͷ࣮̏ͭ // 最初のインデックス var startIndex: Index { get } // 最後の次のインデックス var endIndex: Index { get } // 指定したインデックスに該当する要素 subscript (position: Index) -> _Element { get } 4XJGUY
$PMMFDUJPO͕ཁ͢ٻΔͷ 4XJGUͰ$PMMFDUJPOΛద༻ ⾣ ࠷*ݶOEFYBCMF#BTFϓϩτίϧʹ४ڌ ⾣ ඞਢͷ࣮̐ͭ // 最初のインデックス var startIndex: Index { get } // 最後の次のインデックス var endIndex: Index { get } // 指定したインデックスに該当する要素 subscript (position: Index) -> _Element { get } // あるインデックスの次のインデックスを取得 func index(after i: Index) -> Index 4XJGU1SFWJFX
GVODJOEFY BGUFSJ*OEFY *OEFY ͳͥɺ͚ٛͮΒΕͨͷ͔
*OEFYBCMFʹ
*OEFYBCMFʹ 4XJGUͷ*OEFYBCMF ⾣ *OEFYͱͯ͠'PSXBSE*OEFY5ZQFΛఆ ⾣ ࡧҾ༻ͷৼΔ͍Λ࣋ͭࡧͰܕҾΛදݱ protocol Indexable { associatedtype Index : ForwardIndexType } 4XJGUY
*OEFYBCMFʹ 4XJGUͷ*OEFYBCMF ⾣ *OEFYͱͯ͠$PNQBSBCMFΛఆ ⾣ ࡧҾൺֱͰ͖Εྑ͍ protocol Indexable : IndexableBase { } protocol IndexableBase { associatedtype Index : Comparable } 4XJGU1SFWJFX
*OEFYʹ
*OEFYʹ Ҏલ*OEFYࣗମ͕ҠಈੑΛද͢ݱΔ ⾣ લํҠಈɺํޙҠಈɺϥϯμϜΞΫηε ⾣ *OEFY5ZQF͕ ৼΔ͍Ͱ ҠಈੑΛൃݱ protocol ForwardIndexType { func successor() -> Self } protocol BidirectionalIndexType : ForwardIndexType { func predecessor() -> Self } /* 継承関係を簡略化して記載しています */ 4XJGUY
*OEFYʹ Ҏޙ*OEFYࣗମ͕ҠಈੑΛද͍ͳ͠ݱ ⾣ ද͞ݱΕΔͷൺֱੑ͚ͩ ⾣ *OEFYʹઐ೦ɻҠಈੑ·Ͱൃ͍ͳ͠ݱ protocol Comparable : Equatable { } 4XJGUY
*OEFYʹ Ҡಈੑ*OEFYBCMFͰද͢ݱΔ ⾣ 4XJGUͰɺൣғੑͱΞΫηεੑ ⾣ 4XJGUՃ͑ͯ Ҡಈੑ ͕ඞཁʹͳͬͨ protocol Indexable { var startIndex: Index { get } var endIndex: Index { get } subscript (position: Index) -> _Element { get } func index(after i: Index) -> Index } 4XJGU1SFWJFX
ͭ·Γ
4XJGUͷ$PMMFDUJPO JOEFY BGUFS ͕ඞཁʹͳͬͨཧ༝ ⾣ *OEFYදʹݱઐ೦ʁҠಈੑ࣋ͨͳ͍ ⾣ ΘΓʹ*OEFYBCMFͰҠಈੑΛදݱʁ protocol Indexable { associatedtype Index : Comparable var startIndex: Index { get } var endIndex: Index { get } subscript (position: Index) -> _Element { get } func index(after i: Index) -> Index } 4XJGU1SFWJFX
͋ͬͯΔʁ ͨͿΜɺ͋ͬͯΔɻ
Swift Lab で聞いてみた!
$PMMFDUJPOͷ࠶ઃܭ
$PMMFDUJPOͷ࠶ઃܭ 4XJGUͷίϨΫγϣϯ ⾣ $PMMFDUJPO͕ूੵੑΛදݱ ⾣ 'PSXBSE*OEFY5ZQF #JEJSFDUJPOBM*OEFY5ZQF 3BOEPN"DDFTT*OEFY5ZQFͰҠಈੑΛදݱ // 前方移動性をもつ索引型 protocol ForwardIndexType: Equatable // 前後方移動性をもつ索引型 protocol BidirectionalIndexType: ForwardIndexType // どこへも自由に即時移動できる索引型 protocol RandomAccessIndexType: BidirectionalIndexType // コレクションは集積性と、使用する索引を規定 protocol CollectionType { associatedtype Index : ForwardIndexType 4XJGUY
$PMMFDUJPOͷ࠶ઃܭ 4XJGUͷίϨΫγϣϯ ⾣ $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
·ͱΊ ࣮ͷ؆ུԽͱཧ۶ͷඒ͠͞ όϥϯεΛऔΓͭͭɺ࠶ઃܭ
࣮ʹඒ͍͠ʜ
!XBSO@VOVTFE@SFTVMU͕ 1MBZHSPVOEͰޮ͔ͳ͍ཧ༝
!XBSO@VOVTFE@SFTVMU
֓ཁ
⾣
ؔϝιουʹ༩͢Δଐੑ
⾣
ΓΛΘͳ͔ͬͨͱ͖ʹ͢ࠂܯΔ
@wran_unused_result
func calculate(values: Int...) -> Int { … }
// 普通は変数に受ける
let answer = calculate(1, 2, 3)
// 変数に受けないと警告になる
calculate(1, 2, 3)
SFTVMUPGDBMMUP
DBMDVMBUFJTVOVTFE
// 変数に受けたくないときは、明示的に破棄する
_ = calculate(1, 2, 3)
4XJGUY
!XBSO@VOVTFE@SFTVMU
4XJGU͔ΒطఆͰࠂܯ
⾣
طఆͰ!XBSO@VOVTFE@SFTVMU͕༩
⾣
ڐՄ͢Δͱ͖!EJTDBSEBCMF3FTVMUΛ໌ه
// この書き方で、戻り値を使わないと警告
func calculate(values: Int...) -> Int { … }
// 戻り値を使わなくて良いことを許可したい場合
@discardableResult
func apply(effect: Effect) -> Image { … }
4XJGU1SFWJFX
1MBZHSPVOEͰ͞ࠂܯΕͳ͍
1MBZHSPVOEͰ͞ࠂܯΕͳ͍
ͳͥɺ͞ࠂܯΕͳ͍ͷ͔ʁ
⾣
1MBZHSPVOE͕݁Ռදࣔʹ͏͔Βʁ
⾣
ͦ͏͍͑ࢀরؔڍಈ͕ҧͬͨΑ͏ͳʁ
@wran_unused_result
func calculate(values: Int...) -> Int { … }
// 普通は変数に受ける
let answer = calculate(1, 2, 3)
// Playground だと警告にならない
calculate(1, 2, 3)
4XJGUY
Swift Lab で聞いてみた!
1MBZHSPVOEͰ͞ࠂܯΕͳ͍ ͳͥɺ͞ࠂܯΕͳ͍ͷ͔ʂ ⾣ 1MBZHSPVOE͕݁Ռදࣔʹ͏͔Βʂ ⾣ 1MBZHSPVOEઐ༻ͷಈ࡞Ϟʔυ͕͋ΔΒ͍͠ // このようなコードが自動生成される(喩え) let tmp = getValue() print(tmp) 4XJGUY
·ͱΊ 1MBZHSPVOEઐ༻ϞʔυͰಈ࡞ ௨ৗϞʔυͱҟͳΔڍಈΛࣔ͢͜ͱ
4XJGUಛघϞʔυʁ ͥΜͥΜ͔Βͳ͍ͳΓʹࢼͯ͠ΈΔʜ͕ʂ ϦϯΧ·ΘΓʹૄ͘ɺͻͱ·్ͣதஅ೦
4XJGUಛघϞʔυ 1MBZHSPVOEϞʔυΛࢼΈΔʜ ⾣ ϑϩϯτΤϯυΛ1MBZHSPVOEʹࢦఆ ⾣ TXJGUD9GSPOUFOEQMBZHSPVOEGJMFTXJGU // ただし、この段階では実行時エラー use of unresolved identifier '$builtin_log_with_id' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_scope_entry' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_scope_entry' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_with_id' 4XJGUY
4XJGUಛघϞʔυ 1MBZHSPVOET3VOUJNF ⾣ 1MBZHSPVOET3VOUJNF͕ඞཁ IUUQTHJUIVCDPNBQQMFTXJGUMMECUSFFNBTUFS QBDLBHFT1ZUIPOMMECTVJUFUFTUMBOHTXJGUQMBZHSPVOET
4XJGUಛघϞʔυ 1MBZHSPVOET3VOUJNFΛϏϧυʜ ⾣ DEMMECQBDLBHFT1ZUIPOMMECTVJUFUFTUMBOH TXJGUQMBZHSPVOET ⾣ NBLFMJC1MBZHSPVOET3VOUJNFEZMJC IUUQTHJUIVCDPNBQQMFTXJGUMMECUSFFNBTUFS QBDLBHFT1ZUIPOMMECTVJUFUFTUMBOHTXJGUQMBZHSPVOET
4XJGUಛघϞʔυ ࣮ߦϑΝΠϧΛϏϧυͯ͠ΈΔʜ ⾣ TXJGUD 9GSPOUFOEQMBZHSPVOE FNJUPCKFDUpMFTXJGU ⾣ TXJGUDMJC1MBZHSPVOET3VOUJNFEZMJCpMFP ⾣ NBJO ͜ΕͰ͍͍ͷ͔ʜΘ͔Βͳ͍ IUUQTHJUIVCDPNBQQMFTXJGUMMECUSFFNBTUFS QBDLBHFT1ZUIPOMMECTVJUFUFTUMBOHTXJGUQMBZHSPVOET
4XJGUಛघϞʔυ 1MBZHSPVOET3VOUJNF ⾣ ͍͔ͭ͘ͷػೳ͕༻ҙ͞Ε͍ͯΔ ⾣ ͜ΕΛ͑ΔΑ͏ʹ͢Δʹʜʁ @_silgen_name ("playground_log_scope_entry") func builtin_log_scope_entry(_:,_:,_:,_:) -> AnyObject? @_silgen_name ("playground_log_scope_exit") func builtin_log_scope_exit(_:,_:,_:,_:) -> AnyObject? @_silgen_name ("playground_log_postprint") func builtin_postPrint(_:,_:,_:,_:) -> AnyObject? @_silgen_name ("DVTSendPlaygroundLogData") func builtin_send_data(_ object:AnyObject?) { @_silgen_name ("GetOutput") func get_output() -> String
Ͳͳ͔ͨɺ͍ͩͯ͑͘͞ڭʂ N @@ N
4XJGU0QFO)PVST ϥϘͰ࣭ͨ͜͠ͱ/* 再掲 */ ྻ͕ࢠڍ-PXFS$BNFM$BTFʹͳͬͨ۩ମతͳཧ༝ʁ !TXJGU@NJHSBUJPOଐੑͷ͍ํΛΓ͍ͨ *60ଐੑೖΕࢠʹͰ͖ͳ͍ͣͳͷʹ ೖΕࢠʹͰ͖Δ߹͕͋Δͷͳͥʁ $PMMFDUJPOͰJOEFY BGUFS ͕ඞਢʹͳͬͨཧ༝ʁ TPVSDF-PDBUJPOͱpMF࿈ಈ͠ͳ͍ͷʁ ETPIBOEMF࣮ߦ࣌ΤϥʔʹͳΔ͕ɺͲ͏͏ͷ͔ ͳͥEFGFSͰએݴલͷม͕͑Δͷ͔ !DPOWFOUJPOͷ༻్Λ͏গ͠ৄ͘͠Γ͍ͨ ධՁࣜʹର͢ΔTFMGͲ͏͍͏ޮೳ͕͋Δͷ͔ ʹܕର͢ΔTFMGΛলུͰ͖Δ߹͕͋Δͷͳͥʁ !XBSO@VOVTFE@SFTVMU͕1MBZHSPVOEͰޮ͔ͳ͍ཧ༝ʁ
88%$ ͱָ͍ͬͯ͠
Έͳ͞Μɺͥͻ࣍ճࢀՃͯ͠ ଘʹ-BCΛຬ٤ͯ͠Έ͍ͯͩ͘͞ʂ
Enjoy! Swift /* Thank you */