193 Views
May 25, 19
スライド概要
Swift のイニシャライザーについて、その基本的なところを特にクラス焦点を絞って紹介してみます。クラスに用意されている3つのイニシャライザーの特徴、それらの役割、それを連携したり、隠蔽される場面とか、いろんな観点から整理していってみます。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 408 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
4XJGU ΫϥεͷΠχγϟϥΠβʔ ۽୩༑ !FT@LVNBHBJ J1IPOF%FW4BQQPSPษڧձ.BZ 4XJGUWFSTJPO
۽୩༑ 5PNPIJSP,VNBHBJ ⾣ ΈΜͳͰָ͠Ήษڧձ͕͖ɻ ⾣ ϓϩάϥϛϯάͷָ͠͞Λ͍͖͍͑ͯͨɻ w ωοτϥδΦ w ษڧձͷํ։࠵ w ಉਓࢽଈചձ
گۙ
ษڧձͷָͬͯ͠͞ɺͳΜ͚ͩͬʁ
͖͔͚ͬɺٕज़ॻయ χίχίձٞͰ։࠵͞Εٕͨज़ॻయ ٕज़͚ͩ͡Όͳ͍lਓz͕ߦ͖ަ͏ɺจԽͷަࠩ ্࢙ࣗɺ࠷ߴͷٕज़ॻయ
ҎདྷɺԠԉத ͘͞ΒγϯσϨϥ χίχίձٞ ՎͬͯΈͨͰ८Γ⁊ͬͨΞΠυϧάϧʔϓ ৽॓ͱळ༿ͰݪϥΠϒ׆ಈͬͯʜ͍͢͝ ൴ঁͨͪͷඳ͘ੈքʹɺ ϓϩάϥϛϯάษڧձͷlཧz͕ॏͳͬͯ͡ײΔ
d J04$PO JO-POEPO ⾣ -POEPOͰ։࠵͞ΕΔ J04ͷ ํΧϯϑΝϨϯε ⾣ ϓϩάϥϛϯάʹ·͙ͬ͢ͳҹ ⾣ ؒͷே͔Β༦·Ͱ w w w τϥοΫͷฏߦల։ ֤ηογϣϯʙ ηογϣϯຖʹ Ҏ্ͷ$P⒎FF#SFBLλΠϜ ͔ͭͯͷɺษڧձΒ͠͞Λ͡ײΔॴ
׆ಈ ओʹҎ߱
NPPLNPPLSBEJP NPPL ۽୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ͔Β ௌ͑ͯ͘͜ΔʹࣖΛָ͚ͯ͠ΉϥδΦ ຖ݄ୈ̎ɾୈ̐ ݄༵ ʹ৴ IUUQLFQDNPPLNPPLSBEJPDPN ⾣ ୈ 4XJGU4ZOUBY ⾣ ୈ ٕज़ॻయ̒ɺٕͦͯ͠ज़ಉਓࢽ ⾣ ୈ Ϧʔμϒϧίʔυɺ͜ΕͲ͏͍͏͜ͱʁ ⾣ ୈ ৽ࣾձਓ͞Μʹಧ͚͍ͨɺय़ͷϙουΩϟετ·ͭΓɻ ⾣ ୈ "QQMF$BS1MBZ ⾣ ୈ 4UBUJDͱ4JOHMFUPO ⾣ ୈ ϓϩάϥϛϯά͢Δͱ͖ɺԿߟ͑ͯΔʁ ⾣ ୈ θϩ͔Β࢝·ΔΠϯσοΫε
։࠵݄ؒظ ʙ݄ IUUQTQPEDBTUGFTUJWBMpSFCBTFBQQDPN ۽୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ͔Β ௌ͑ͯ͘͜ΔʹࣖΛָ͚ͯ͠ΉϥδΦࢀՃ
ΈΜͳͰ 4XJGU ෮शձ(0 ʜΈΜͳͰ4XJGU෮शձ(0JOࡳຈr TU⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOԭೄr OE⒌ 4XJGU%BZ ʜΈΜͳͰ4XJGU෮शձ(0JOઋr SE⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOԬr UI⒌ 4XJGU%BZ ʜΈΜͳͰ4XJGU෮शձ(0JOԬr UI⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOژr UI⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOr UI⒌ XJUI/4&( ʜΈΜͳͰ4XJGU෮शձ(0JOԬr UI⒌ ʜΈΜͳͰ4XJGU෮शձ(0JOؠखr UI⒌ 4XJGU%BZ ʜΈΜͳͰ4XJGU෮शձ(0JOࡳຈr UI⒌ NJOJ ʜΈΜͳͰ4XJGU෮शձ(0JOԬr TU⒌ தࢭ
ٕज़ܥಉਓࢽ ࣗඅग़൛ͱಉਓࢽଈചձ
ࣥ͘͘චձ ʙٕज़ܥಉਓࢽʗࢽۀɾൃදࢿྉɾϒϩάʙ IUUQTUFDICPPLNFFUVQDPOOQBTTDPN ⾣ ̎पه೦ϐΫχοΫˏઍ༿ɾນுւެԂ ⾣ ˑग़ு൛3&7!ਆాਆอொ ⾣ ˑग़ு൛3&7!౦ాוژ
ٕज़ॻಉਓࢽതཡձ େా۠࢈ۀϓϥβ1J0
ίϛοΫϚʔέοτʢͷநબͪʣ ʙ !౦ژϏοάαΠτ ͷநબͪ
৽ץ !ٕज़ॻయ̒
!ٕज़ॻయ̒ 4XJGU ΠχγϟϥΠβʔେશ 4XJGUͷΠχγϟϥΠβʔͷجຊ͔Βɺ֤ʹܕΈΒ ΕΔಛͷҧ͍ɺԿͰ͚ͩ͏͘ͳؾݟམͱ͠ ͕ͪͳཹҙͳͲΛղઆͨ͠ೖॻͰ͢ɻ ༷ ⾣ ຊ൛ɺిࢠ൛ ⾣ " ⾣ ϖʔδ #005)Ͱग़த
ࠓճͷςʔϚ ΫϥεͷΠχγϟϥΠβʔ
ΠχγϟϥΠβʔͱʁ ܕͷΠϯελϯεΛੜ͢Δͷ ͱࢥ͓͚ͬͯྑͦ͞͏
ίϯετϥΫλʔ
$POTUSVDUPS ΦϒδΣΫτੜͷݪଇ ϝϞϦʔׂΓͯ "MMPDBUJPO ॳظԽ *OJUJBMJ[BUJPO
$POTUSVDUPS 0CKFDUJWF$ NSObject *obj = [[NSObject alloc] init];
$POTUSVDUPS $ޠݴ void* p = malloc(size); memcpy(p, src, size);
$POTUSVDUPS $ ޠݴ CObject *object = new CObject();
$POTUSVDUPS $ ޠݴ CObject object = CObject();
$POTUSVDUPS 4XJGUޠݴ let object = Object();
$POTUSVDUPS 4XJGUͰͷΦϒδΣΫτੜ ϝϞϦʔׂΓͯ "MMPDBUJPO 4XJGU͕ɺඞཁͳϝϞϦʔྖҬΛׂΓͯΔ ॳظԽ *OJUJBMJ[BUJPO ϓϩάϥϚʔ͕ɺదʹϝϞϦʔྖҬΛॳظԽ͢Δ ׂΓͯΒΕͨྖҬselfΛ௨ͯ͠ࢀর͢Δ
4XJGUͷ"MMPDBUJPO ੑ࣭ʹԠͨ͡ϝϞϦʔͷׂΓͯ " ܕɺඞཁྖҬΛselfʹׂΓͯΔɻ self TFMGࣗମΛɺಡΈॻ͖͢Δ # ࢀরܕɺඞཁྖҬΛͲ͔͜ʹׂΓͯɺ ׂΓͯͨॴΛselfͰࣔ͢ɻ self TFMGࣗମɺॻ͖ࠐΈෆՄ ࢀরઌΛಡΈॻ͖͢Δ
4XJGUͷ*OJUJBMJ[BUJPO ΠχγϟϥΠβʔͷׂʁ ׂΓͯΒΕͨϝϞϦʔྖҬΛ ࣮֬ʹॳظԽ͢Δ͜ͱ
ΫϥεܕͷΠχγϟϥΠβʔ ׂΓͯΒΕͨྖҬΛ࣮֬ʹॳظԽ͢Δ ܧঝ࣌ʹ࣮֬ʹॳظԽ͢ΔͨΊͷΈ ࢦఆΠχγϟϥΠβʔ %FTJHOBUFE*OJUJBMJ[FS ศٓΠχγϟϥΠβʔ $POWFOJFODF*OJUJBMJ[FS ඞਢΠχγϟϥΠβʔ 3FRVJSFE*OJUJBMJ[FS
ఆٛͷجຊ ࢦఆΠχγϟϥΠβʔ ඞਢΠχγϟϥΠβʔ init(…) required init(…) ศٓΠχγϟϥΠβʔ convenience init(…) required convenience init(…)
%FTJHOBUFE*OJUJBMJ[FS ࢦఆΠχγϟϥΠβʔ ׂ ׂΓͯΒΕͨྖҬΛ࣮֬ʹॳظԽ͢ΔΛෛ͏ ࣮࣌ͷଋ͝ͱ ͻͱͭҎ্ɺඞͣఆٛ͢Δ͜ͱʢطఆΠχγϟϥΠβʔͰՄʣ ෦ͰɺશͯͷϓϩύςΟʔΛॳظԽ͢Δ͜ͱ ܧঝ࣌ɺॳظԽʹޙඞͣͷΠχγϟϥΠβʔΛͼݺग़͢͜ͱ
$POWFOJFODF*OJUJBMJ[FS ศٓΠχγϟϥΠβʔ ׂ ҾΛॲཧͯ͠ɺࢦఆΠχγϟϥΠβʔʹҾ͖͙ܧΛෛ͏ ࣮࣌ͷଋ͝ͱ ෦ͰɺࣗͷΠχγϟϥΠβʔΛͼݺग़͢͜ͱ ϓϩύςΟʔͷॳظԽࢦఆΠχγϟϥΠβʔʹҕͶΔ ॳظԽʹޙϓϩύςΟʔΛհͯ͠ͷมߋՄೳ ܧঝ࣌ɺඞͣࣗͷΠχγϟϥΠβʔΛͼݺग़͢͜ͱ
3FRVJSFE*OJUJBMJ[FS ඞਢΠχγϟϥΠβʔ ׂ ͜ͷΠχγϟϥΠβʔ͕কདྷʹͬͯଘࡏ͢Δ͜ͱΛอূ͢Δ ࢦఆΠχγϟϥΠβʔʹศٓΠχγϟϥΠβʔʹ༻Մೳ ࣮࣌ͷଋ͝ͱ جຊతͳଋ͝ͱɺݩͷΠχγϟϥΠβʔͱಉ͡ ܧঝ࣌ͰӅṭ͞ΕΔ߹ɺඞͣ࠶ఆ͕ٛඞཁ
ΠχγϟϥΠβʔͷӅṭ
Ϋϥεܧঝ࣌ʹ͓͚Δ ΠχγϟϥΠβʔͷӅṭ ͷΠχγϟϥΠβʔ͕Ӆṭ͞ΕΔ͜ͱ͕͋Δ Ӆṭ͞ΕΔͷɺ ܧঝઌͰࢦఆΠχγϟϥΠβʔΛՃͨ͠ͱ͖
ΠχγϟϥΠβʔͷӅṭ ͳͥɺӅṭ͞ΕΔʁ ׂΓͯΒΕͨϝϞϦʔྖҬΛ ࣮֬ʹॳظԽ͢ΔͨΊ
Ӆṭ͞ΕΔཧ༝ ܧঝઌͷࢦఆΠχγϟϥΠβʔ͕ݺΕͳ͍ࣄଶΛ͙ͨΊ ⾣ ΫϥεɺܧঝઌͷॳظԽΛఆ͍ͯ͠ͳ͍ ⾣ ࣮֬ͳॳظԽΛߦ͏ͨΊʹɺ ܧঝઌͷࢦఆΠχγϟϥΠβʔΛ࣮֬ʹݺͤΔඞཁ͕͋Δ ΫϥεͷΠχγϟϥΠβʔΛӅṭ͢Δ͜ͱͰ࣮͢ݱΔ
Ӆṭ͞ΕΔཧ༝ ܧঝઌͷࢦఆΠχγϟϥΠβʔ͕ݺΕͳ͍ࣄଶΛ͙ͨΊ ܧঝઌΛਖ਼֬ʹ ॳظԽ͢Δಓ͚ͩʹ͢Δ ੜΫϥε TFMG جఈΫϥε TVQFS ܧঝઌͷJOJU͚͕ͩ ݺΕΔՄೳੑΛະવʹ͙ init B convenience init A init Ӆṭ Ӆṭ
Ӆṭ͞Εͳ͍͜ͱ͋Δ
Ӆṭ͞Εͳ͍໘ ܧঝઌͰΠχγϟϥΠβʔΛఆٛ͠ͳ͍ͱ͖ ͷΠχγϟϥΠβʔͰ ࣮֬ʹॳظԽՄೳ ੜΫϥε TFMG جఈΫϥε TVQFS ܧঝઌͰͷಛผͳ ॳظԽॲཧ͕ඞཁͳ͍߹ init A convenience init B
Ӆṭ͞Εͳ͍໘ ܧঝઌͰศٓΠχγϟϥΠβʔ͚ͩΛఆٛ͢Δͱ͖ ͷΠχγϟϥΠβʔͰ ࣮֬ʹॳظԽՄೳ ܧঝઌͰͷಛผͳ ॳظԽॲཧଘࡏ͠ͳ͍ ੜΫϥε convenience TFMG init C جఈΫϥε TVQFS init A convenience init B
Ӆṭ͞Εͳ͍໘ ܧঝઌͰશͯͷࢦఆΠχγϟϥΠβʔΛ࠶ఆٛͨ͠ͱ͖ ܧঝઌͷࢦఆΠχγϟϥΠβʔʹඞͣḷΓண͚Δ ੜΫϥε convenience TFMG init C جఈΫϥε TVQFS init C override init A init A init D convenience init B
ΫϥεͷΠχγϟϥΠβʔ ·ͱΊ Ϋϥεʹ͓͚ΔΠχγϟϥΠβʔͷಛ ࢦఆΠχγϟϥΠβʔ ศٓΠχγϟϥΠβʔ ඞਢΠχγϟϥΠβʔ ܧঝઌͰΠχγϟϥΠβʔΛ࣮͢Δͱɺ ͷΠχγϟϥΠβʔ͕Ӆṭ͞ΕΔ߹͕͋Δ Ӆṭ͞Εͳ͍߹ ܧঝઌͰΠχγϟϥΠβʔΛఆٛ͠ͳ͍ͱ͖ ܧঝઌͰศٓΠχγϟϥΠβʔ͚ͩΛఆٛ͢Δͱ͖ ܧঝઌͰɺͷશͯͷࢦఆΠχγϟϥΠβʔΛఆٛ͢Δͱ͖
&OKPZ1SPHSBNNJOH 5IBOLZPV ۽୩༑ !FT@LVNBHBJ