108 Views
July 01, 16
スライド概要
WWDC.next にて、以前に話した『Swift ラボで聞いてきた話』で話せなかった話題をもう1つ話しました。『評価式で使う .self の効果は?』みたいな話題をざっくり紹介します。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 1,576 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
4XJGU0QFO)PVST %FWFMPQFS5PPMT-BC" !88%$ /* 2016.07.01 @ WWDC.next */ &;/&5۽୩༑ 4XJGU1SFWJFX IUUQF[OFUKQ
۽୩༑ /* @es_kumagai */ 5PNPIJSP,VNBHBJ /** */ ⾣ 4XJGU͕ޠݴେ͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษڧձ͕େ͖Ͱ͢ʂ ⾣ ษڧձͰൃද͢Δͷ͕ͱ͖ͬͯͰ͢ʂ ⾣ ॻ੶9DPEFపఈղઆॻ͖·ͨ͠ɻ ⾣ ٕज़ϒϩά&;/&5Λॻ͍ͨΓͯ͠·͢ɻ
ษڧձΛ։࠵ͯ͠·͢ɻ ԣJ1IPOF։ൃऀษڧձ ΧδϡΞϧ4XJGUษڧձ ZJEFW ˏԣɾഅंಓ DTXJGU !ԣɾ੨༿ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕తͷձ ΏΔ͘ΈΜͳͰ4XJGU͍ͯͭʹޠݴ ޠΒ͑Δ͕ཉͯ࢝͘͠Ίͨձ ୈ̎̐ճΛʹ։࠵༧ఆ ୈ̍̌ճ։࠵ࠐݟ /** */ ⾣ J044XJGUͷษڧձΛ։࠵ͯ͠·͢ɻ ⾣ ҆৺ͯ͠ஊٛʹՖΛ࡙͔ͤΒΕ·͢Α͏ʹɻ
8 8 %$ /* 2016/06/13 2016/06/17 */
88%$ ͍ͪΜָ͠Έʹ͍ͯͨ͠ηογϣϯ
0QFO4PVSDFʹͳ͍Ӆ͕͋͠ۄΔ͔
ͳ͔ͬͨʜ ˚A
88%$ ؑͨ͠શηογϣϯ
ؑͨ͠શηογϣϯ 8IBU`T/FXJO4XJGU
ؑͨ͠શηογϣϯ 4XJGU"1*%FTJHO(VJEFMJOFT
ؑͨ͠શηογϣϯ (FUUJOH4UBSUFEXJUI4XJGU
ؑͨ͠શηογϣϯ 7JTVBM%FCVHHJOHXJUI9DPEF
ؑͨ͠શηογϣϯ *OUSPEVDJOH4XJGU1MBZHSPVOE
ؑͨ͠શηογϣϯ *NQSPWJOH&YJTUJOH"QQT
ؑͨ͠શηογϣϯ ߹ؒ ͭ̑ܭҧͬͯ̍ͭ 8IBU`T/FXJO4XJGU 4XJGU"1*%FTJHO(VJEFMJOFT (FUUJOH4UBSUFEXJUI4XJGU 7JTVBM%FCVHHJOHXJUI9DPEF *OUSPEVDJOH4XJGU1MBZHSPVOE *NQSPWJOH&YJTUJOH"QQT
88%$ ͦΕҎ֎Կ͍ͯͨ͠ͷʁ
4XJGU-BCʂ %FWFMPQFS5PPMT-BC"
%FWFMPQFS5PPMT-BC" 4XJGU0QFO)PVST
4XJGU0QFO)PVST ϥϘͰ࣭ͨ͜͠ͱ ྻ͕ࢠڍ-PXFS$BNFM$BTFʹͳͬͨ۩ମతͳཧ༝ʁ !TXJGU@NJHSBUJPOଐੑͷ͍ํΛΓ͍ͨ *60ଐੑೖΕࢠʹͰ͖ͳ͍ͣͳͷʹ ೖΕࢠʹͰ͖Δ߹͕͋Δͷͳͥʁ $PMMFDUJPOͰJOEFY BGUFS ͕ඞਢʹͳͬͨཧ༝ʁ TPVSDF-PDBUJPOͱpMF࿈ಈ͠ͳ͍ͷʁ ETPIBOEMF࣮ߦ࣌ΤϥʔʹͳΔ͕ɺͲ͏͏ͷ͔ ͳͥEFGFSͰએݴલͷม͕͑Δͷ͔ !DPOWFOUJPOͷ༻్Λ͏গ͠ৄ͘͠Γ͍ͨ ධՁࣜʹର͢ΔTFMGͲ͏͍͏ޮՌ͕͋Δͷ͔ ʹܕର͢ΔTFMGΛলུͰ͖Δ߹͕͋Δͷͳͥʁ !XBSO@VOVTF@SFTVMU͕1MBZHSPVOEͰޮ͔ͳ͍ཧ༝ʁ
88%$ 4XJGU-BC࠷ߴʂ
4XJGU0QFO)PVST ͦ͜ͰਘͶͨ͜ͱΛ̍ͭհ
ධՁࣜʹର͢Δ TFMG ͷޮՌ
ධՁࣜʹର͢Δ TFMG ͷޮՌ ൃ ⾣ ʹ໊ܕTFMGΛ͚ΔͱϝλλΠϓʹͳΔ ⾣ ධՁࣜʹTFMGΛ͚ΒΕΔʂʁ // 型名につけるとメタタイプが得られる let type: Int.Type = Int.self // Int.Type // 評価式に付けると… 評価結果…? let value: Int = (5 + 3).self // 8
ධՁࣜʹର͢Δ TFMG ͷޮՌ TFMG͕ͳ͍ͷͱԿ͕ҧ͏ʁ ⾣ TFMGΛ͚Δͱ͕ͦ͜༏ઌ͞ΕΔ͚ΕͲ ⾣ TFMGΛ͚ͳͯ݁͘Ռಉ͡ʁ // 普通に計算すれば、掛け算が優先 let a = 1 + 2 * 5 // 11 // 評価式の一部を .self で括ると… let b = (1 + 2).self * 5 // 15 // でも.self がなくても同じ? let c = (1 + 2) * 5 // 15
ධՁࣜʹର͢Δ TFMG ͷޮՌ TFMGͰධՁ͞Εͯͳ͍ʁ ⾣ ධՁ͞ΕͨΒ·ܾ͕ܕΔͣ ⾣ Ϧςϥϧͷ͕ܕɺ·ܾͩ·Βͳ͍ʁ // 先に評価なら、このように Int 型になりそうだが let a = (1 + 2) as Int * 3.5 Binary operator '*' cannot be applied to operands of type 'Int' and 'Double' // リテラルのまま存続して Double 型に落ち着く let b = (1 + 2).self * 3.5 // 10.5
ධՁࣜʹର͢Δ TFMG ͷޮՌ Ϧςϥϧͱܕͷ͓͞Β͍ ⾣ Ϧςϥϧࣗମʹܕͳ͍ ⾣ ධՁ͞Εͯɺ·ܾ͕ܕΔ let value: Int = 10 let value: Double = 10 let value = 10 as Int32 let value = 10 + doubleValue
Swift Lab で聞いてみた!
ධՁࣜʹର͢Δ TFMG ͷޮՌ ίʔυͷॲཧͷྲྀΕ 4XJGUίʔυ 1BSTFS ͜͜ͰTFMG͕ ΘΕΔΒ͍͠ EVNQQBSTF "45 "CTUSBDU4ZOUBY5SFF 5ZQF$IFDLFS EVNQBTU "45 5ZQFT 4*-(FO FNJUTJMHFO 3BX4*-ʢ4XJGU*OUFSNFEJBUF-BOHVBHFʣ 4*-ॲཧ FNJUTJM $BOPOJDBM4*- *3(FOʜ FNJUJS ࣜͷධՁʢ࣮ߦʣ ͬͱޙΖͰ
TFMG 5ZQF$IFDLFS͕͏Β͍͠
͔֬ΊͯΈ·͠ΐ͏ʂ
ී௨ͳهड़
ධՁࣜʹର͢Δ TFMG ͷޮՌ ී௨ͳهड़ ⾣ ·ͣී௨ͷࣜࢉܭΛ͔֬ΊΔ ⾣ ހׅΛͬͯධՁͷํΛม͑Δ let answer = (1 + 2) * 3.5
ධՁࣜʹର͢Δ TFMG ͷޮՌ ී௨ͳهड़ EVNQQBSTF/* 抜粋 */ ⾣ ͜ͷஈ֊Ͱɺܕܾ·͍ͬͯͳ͍ QBUUFSO@OBNFEBOTXFS TFRVFODF@FYQSUZQFOVMM QBSFO@FYQSUZQFOVMM TFRVFODF@FYQSUZQFOVMM JOUFHFS@MJUFSBM@FYQSUZQFOVMMWBMVF VOSFTPMWFE@EFDM@SFG@FYQSUZQFOVMMOBNF TQFDJBMJ[FEOP JOUFHFS@MJUFSBM@FYQSUZQFOVMMWBMVF VOSFTPMWFE@EFDM@SFG@FYQSUZQFOVMMOBNF TQFDJBMJ[FEOP GMPBU@MJUFSBM@FYQSUZQFOVMMWBMVF
ධՁࣜʹର͢Δ TFMG ͷޮՌ ී௨ͳهड़ EVNQBTU/* 抜粋 */ ⾣ શମ͔Βɺదͳܾ͕ܕఆ͞ΕΔ QBUUFSO@CJOEJOH@EFDM QBUUFSO@OBNFEUZQF%PVCMFBOTXFS CJOBSZ@FYQSUZQF%PVCMFOPUISPX EFDMSFG@FYQSUZQF %PVCMF %PVCMF %PVCMF TQFDJBMJ[FEOP CJOBSZ@FYQSUZQF%PVCMFOPUISPX EFDMSFG@FYQSUZQF %PVCMF %PVCMF %PVCMF TQFDJBMJ[FEOP UVQMF@FYQSJNQMJDJUUZQF %PVCMF %PVCMF DBMM@FYQSJNQMJDJUUZQF%PVCMFOPUISPX JOUFHFS@MJUFSBM@FYQSUZQF*OUWBMVF DBMM@FYQSJNQMJDJUUZQF%PVCMFOPUISPX UZQF@FYQSJNQMJDJUUZQF%PVCMF5ZQFUZQFSFQS%PVCMF JOUFHFS@MJUFSBM@FYQSUZQF*OUWBMVF DBMM@FYQSJNQMJDJUUZQF%PVCMFOPUISPX UZQF@FYQSJNQMJDJUUZQF%PVCMF5ZQFUZQFSFQS%PVCMF GMPBU@MJUFSBM@FYQSUZQF'1*&&&WBMVF
ධՁࣜʹର͢Δ TFMG ͷޮՌ ී௨ͳهड़ FNJUTJMHFO/* 抜粋 */ ⾣ ϦςϥϧΛʹܕม͢Δίʔυ͕ొ TJM!NBJO\ GVODUJPO@SFGTUBUJD JOGJY %PVCMF %PVCMF %PVCMF GVODUJPO@SFG!@5;'TPJN'54E4E@4E!DPOWFOUJPO UIJO %PVCMF %PVCMF %PVCMF GVODUJPO@SFGTUBUJD JOGJY %PVCMF %PVCMF %PVCMF GVODUJPO@SFG!@5'4E$G5@CVJMUJO*OUFHFS-JUFSBM#J@@4E !DPOWFOUJPO UIJO #VJMUJO*OU !UIJO%PVCMF5ZQF %PVCMF NFUBUZQF!UIJO%PVCMF5ZQF JOUFHFS@MJUFSBM#VJMUJO*OU BQQMZ !DPOWFOUJPO UIJO #VJMUJO*OU !UIJO %PVCMF5ZQF %PVCMF GVODUJPO@SFG!@5'4E$G5@CVJMUJO'MPBU-JUFSBM#G@@4E !DPOWFOUJPO UIJO #VJMUJO'1*&&& !UIJO%PVCMF5ZQF %PVCMF NFUBUZQF!UIJO%PVCMF5ZQF GMPBU@MJUFSBM#VJMUJO'1*&&& Y& BQQMZ !DPOWFOUJPO UIJO #VJMUJO'1*&&& !UIJO%PVCMF5ZQF %PVCMF
TFMGΛͬͨهड़
ධՁࣜʹର͢Δ TFMG ͷޮՌ TFMGΛͬͨهड़ ⾣ ධՁࣜʹTFMGΛ͚ͨ߹Λ͔֬ΊΔ ⾣ TFMGͰɺධՁࣜΛධՁ͢Δʁ let answer = (1 + 2).self * 3.5
ධՁࣜʹର͢Δ TFMG ͷޮՌ TFMGΛͬͨهड़ EVNQQBSTF/* 抜粋 */ ⾣ EPU@TFMG@FYQS͕Ճ͞Ε͚ͨͩ QBUUFSO@OBNFEBOTXFS TFRVFODF@FYQSUZQFOVMM EPU@TFMG@FYQSUZQFOVMM QBSFO@FYQSUZQFOVMM TFRVFODF@FYQSUZQFOVMM JOUFHFS@MJUFSBM@FYQSUZQFOVMMWBMVF VOSFTPMWFE@EFDM@SFG@FYQSUZQFOVMMOBNF TQFDJBMJ[FEOP JOUFHFS@MJUFSBM@FYQSUZQFOVMMWBMVF VOSFTPMWFE@EFDM@SFG@FYQSUZQFOVMMOBNF TQFDJBMJ[FEOP GMPBU@MJUFSBM@FYQSUZQFOVMMWBMVF
ධՁࣜʹର͢Δ TFMG ͷޮՌ TFMGΛͬͨهड़ EVNQBTU/* 抜粋 */ ⾣ EPU@TFMG@FYQSͷܾ͕ܕఆ͞Ε͚ͨͩ QBUUFSO@CJOEJOH@EFDM QBUUFSO@OBNFEUZQF%PVCMFBOTXFS CJOBSZ@FYQSUZQF%PVCMFOPUISPX EFDMSFG@FYQSUZQF %PVCMF %PVCMF %PVCMF TQFDJBMJ[FEOP EPU@TFMG@FYQSUZQF %PVCMF CJOBSZ@FYQSUZQF%PVCMFOPUISPX EFDMSFG@FYQSUZQF %PVCMF %PVCMF %PVCMF TQFDJBMJ[FEOP UVQMF@FYQSJNQMJDJUUZQF %PVCMF %PVCMF DBMM@FYQSJNQMJDJUUZQF%PVCMFOPUISPX JOUFHFS@MJUFSBM@FYQSUZQF*OUWBMVF DBMM@FYQSJNQMJDJUUZQF%PVCMFOPUISPX UZQF@FYQSJNQMJDJUUZQF%PVCMF5ZQFUZQFSFQS%PVCMF JOUFHFS@MJUFSBM@FYQSUZQF*OUWBMVF DBMM@FYQSJNQMJDJUUZQF%PVCMFOPUISPX UZQF@FYQSJNQMJDJUUZQF%PVCMF5ZQFUZQFSFQS%PVCMF GMPBU@MJUFSBM@FYQSUZQF'1*&&&WBMVF
ධՁࣜʹର͢Δ TFMG ͷޮՌ TFMGΛͬͨهड़ FNJUTJMHFO/* 抜粋 */ ⾣ ී௨ʹͨ͠ࡌهͷͱ ·ͬͨ͘ಉ͡ ίʔυ TJM!NBJO\ GVODUJPO@SFGTUBUJD JOGJY %PVCMF %PVCMF %PVCMF GVODUJPO@SFG!@5;'TPJN'54E4E@4E!DPOWFOUJPO UIJO %PVCMF %PVCMF %PVCMF GVODUJPO@SFGTUBUJD JOGJY %PVCMF %PVCMF %PVCMF GVODUJPO@SFG!@5'4E$G5@CVJMUJO*OUFHFS-JUFSBM#J@@4E !DPOWFOUJPO UIJO #VJMUJO*OU !UIJO%PVCMF5ZQF %PVCMF NFUBUZQF!UIJO%PVCMF5ZQF JOUFHFS@MJUFSBM#VJMUJO*OU BQQMZ !DPOWFOUJPO UIJO #VJMUJO*OU !UIJO %PVCMF5ZQF %PVCMF GVODUJPO@SFG!@5'4E$G5@CVJMUJO'MPBU-JUFSBM#G@@4E !DPOWFOUJPO UIJO #VJMUJO'1*&&& !UIJO%PVCMF5ZQF %PVCMF NFUBUZQF!UIJO%PVCMF5ZQF GMPBU@MJUFSBM#VJMUJO'1*&&& Y& BQQMZ !DPOWFOUJPO UIJO #VJMUJO'1*&&& !UIJO%PVCMF5ZQF %PVCMF
·ͱΊ ධՁࣜͷTFMGࣗମԿ͠ͳ͍ 4*-ੜ࣌ʹফ໓͢Δ
4XJGU0QFO)PVST ϥϘͰ࣭ͨ͜͠ͱ/* 再掲 */ ྻ͕ࢠڍ-PXFS$BNFM$BTFʹͳͬͨ۩ମతͳཧ༝ʁ !TXJGU@NJHSBUJPOଐੑͷ͍ํΛΓ͍ͨ *60ଐੑೖΕࢠʹͰ͖ͳ͍ͣͳͷʹ ೖΕࢠʹͰ͖Δ߹͕͋Δͷͳͥʁ $PMMFDUJPOͰJOEFY BGUFS ͕ඞਢʹͳͬͨཧ༝ʁ TPVSDF-PDBUJPOͱpMF࿈ಈ͠ͳ͍ͷʁ ETPIBOEMF࣮ߦ࣌ΤϥʔʹͳΔ͕ɺͲ͏͏ͷ͔ ͳͥEFGFSͰએݴલͷม͕͑Δͷ͔ !DPOWFOUJPOͷ༻్Λ͏গ͠ৄ͘͠Γ͍ͨ ධՁࣜʹର͢ΔTFMGͲ͏͍͏ޮೳ͕͋Δͷ͔ ʹܕର͢ΔTFMGΛলུͰ͖Δ߹͕͋Δͷͳͥʁ !XBSO@VOVTF@SFTVMU͕1MBZHSPVOEͰޮ͔ͳ͍ཧ༝ʁ
88%$ ͱָ͍ͬͯ͠
Έͳ͞Μɺͥͻ࣍ճࢀՃͯ͠ ଘʹ-BCΛຬ٤ͯ͠Έ͍ͯͩ͘͞ʂ
Enjoy! Swift /* Thank you */