Swift イニシャライザー復習会 #love_swift #akibaswift #21cafe

>100 Views

March 06, 17

スライド概要

Swift のイニシャライザーの基礎的なところについて 30 分くらいで復習するのに使った資料です。2017/03/06 の『AKIBA.swift × Swift愛好会 vol2』で発表しました。

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 2,197 でした。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

ΠχγϟϥΠβʔ ෮शձ !",*#"TXJGUº4XJGUѪ޷ձWPM ‫۽‬୩༑޺ IUUQF[OFUKQ 4XJGU TXJGUQN

2.

‫۽‬୩༑޺ 5PNPIJSP,VNBHBJ ⾣ 4XJGU‫͕ޠݴ‬௒େ޷͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษ‫ڧ‬ձ͕େ޷͖Ͱ͢ʂ ⾣ ϓϩάϥϛϯάͷָ͠͞Λ఻͍͖͍͑ͯͨɻ !FT@LVNBHBJ UPNPIJSPLVNBHBJ $PEF1JFDFGPSNBD04 IUUQF[OFUKQ 9DPEFపఈղઆ

3.

ษ‫ڧ‬ձΛ։࠵͍ͯ͠·͢ɻ Θ͍Θ͍ɺָ͘͠ɺ ΈΜͳͰ‫ޠ‬Β͑Δ৔ॴΛ໨ࢦͯ͠ ԣ඿J1IPOF։ൃऀษ‫ڧ‬ձ ୈճ໨Λ݄೔ʹ։࠵ʢ໨ඪʣ ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ZJEFW ˏԣ඿ɾഅंಓ IUUQTBUOEPSHHSPVQTZJEFW ୈճ໨͸‫ݕ‬౼த DTXJGU !ԣ඿ɾ੨༿୆ IUUQTBUOEPSHHSPVQTDTXJGU ΈΜͳͰ4XJGU ෮शձ NJOOB@EF@TXJGU ˏौ୩ ୈճ໨Λ݄೔ʹ։࠵༧ఆ IUUQDTXJGUDPOOQBTTDPN

4.

NPPLNPPLSBEJP ϜοΫϜοΫϥδΦ ‫۽‬୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ಺͔Β ௌ͑ͯ͘͜Δ੠ʹࣖΛ܏ָ͚ͯ͠ΉϥδΦ ຖ݄ୈ̎ɾୈ̐ ݄༵೔ ʹ഑৴ IUUQNPPLNPPLSBEJPDPNB ⾣ ୈ࿩  ʰNFUIPEEJTQBUDIʱ ⾣ ୈ࿩  ʰάϩʔόϧม਺ʱ ⾣ ୈ࿩  ʰHFUUFSͱTFUUFSʱ ⾣ ୈ࿩  ʰ‫ܕ‬ΤΠϦΞεʹ૝͍Λ஘ͤΔʱ ⾣ ୈ ̕ ࿩  ʰVOTBGF#JU$BTUΛ‫ͭݟ‬ΊͯΈ͍ͨʱ ⾣ ୈ ̔ ࿩  ʰ໊લۭؒͷ੠͕ௌ͖͍ͨʱ

5.

ΠχγϟϥΠβʔ

6.

Πϯελϯεͷੜ੒  ‫ج‬ຊॻࣜ  ࣮૷ͷ‫ج‬ຊ

7.

Πϯελϯεͷੜ੒ ‫ج‬ຊॻࣜ ⾣ ‫ʹܕ‬JOJUͰఆٛ͢Δ ⾣ Ҿ਺ϦετΛఴ͑ɺ໭Γ஋͸ࢦఆ͠ͳ͍ struct Person { init(name: String, number: Int) { } }

8.

Πϯελϯεͷੜ੒ ࣮૷ͷ‫ج‬ຊ ⾣ શͯͷอଘ‫ܕ‬ϓϩύςΟʔΛॳ‫ظ‬Խ͢Δ ⾣ ͻͱͭͰ΋ॳ‫ظ‬Խ͠ͳ͍ͱίϯύΠϧΤϥʔ struct Person { var name: String var number: Int init(name: String, number: Int) { self.name = name } } SFUVSOGSPNJOJUJBMJ[FSXJUIPVUJOJUJBMJ[JOHBMMTUPSFEQSPQFSUJFT

9.

ੜ੒Ͱ͖ͳ͍͜ͱΛߟྀ  ࣦഊͨ͠ΒͲ͏͠Α͏΋ͳ͍ͱ͖  ࣦഊ͢Δ͔΋͠Εͳ͍ͱ͖  ࣦഊͷৄࡉΛ௨஌͍ͨ͠ͱ͖

10.

ੜ੒Ͱ͖ͳ͍͜ͱΛߟྀ ࣦഊͨ͠ΒͲ͏͠Α͏΋ͳ͍ͱ͖ ⾣ ௨ৗ௨ΓJOJUͰ࣮૷͢Δ ⾣ ࣦഊ͸GBUBM&SSPSͰ௨஌͢Δ struct Person { init(name: String, number: Int) { guard name.isVaidAsPersionName() else { fatalError("Invalid name") } :

11.

ੜ੒Ͱ͖ͳ͍͜ͱΛߟྀ ࣦഊ͢Δ͔΋͠Εͳ͍ͱ͖ ⾣ init?·ͨ͸init!Ͱ࣮૷͢Δ ⾣ ࣦഊͨ͠ΒnilΛฦ͢ struct Person { init?(name: String, number: Int) { guard name.isVaidAsPersionName() else { return nil } :

12.

ੜ੒Ͱ͖ͳ͍͜ͱΛߟྀ ࣦഊͷৄࡉΛ௨஌͍ͨ͠ͱ͖ ⾣ init … throwsͰ࣮૷͢Δ ⾣ ࣦഊͨ͠Β&SSPSΛฦ͢ struct Person { init(name: String, number: Int) throws { guard name.isVaidAsPersionName() else { throw InitializeError.invalidName } :

13.

ੜ੒Ͱ͖ͳ͍͜ͱΛߟྀ ະॳ‫ظ‬ԽͰ΋ࣦഊͰ͖Δ ⾣ ϓϩύςΟʔΛॳ‫ظ‬Խͯ͠ͳͯ͘΋ࣦഊͰ͖Δ ⾣ Ҏલ͸ॳ‫ظ‬ԽΛࡁ·ͤͳ͍ͱ͍͚ͳ͍৔߹͕͋ͬͨ class Person { var name: String var number: Int init?(name: String, number: Int) { guard name.isVaidAsPersionName() else { return nil } อଘ‫ܕ‬ϓϩύςΟʔͷॳ‫ظ‬ԽલͰ΋ࣦഊՄೳ

14.

ΠχγϟϥΠβʔͷ໋໊‫ن‬ଇ  ϥϕϧ෇͚ͷ‫ج‬ຊ  ஋อଘͷ‫ܕ‬ม‫Ͱ׵‬ͷ໋໊‫ن‬ଇ 7BMVF1SFTFSWJOH5ZQF$POWFSTJPO  ղऍΛ൐͏‫ܕ‬ม‫Ͱ׵‬ͷ໋໊‫ن‬ଇ /BSSPXJOH5ZQF$POWFSTJPO

15.

ΠχγϟϥΠβʔͷ໋໊‫ن‬ଇ ϥϕϧ෇͚ͷ‫ج‬ຊ ⾣ Ҿ਺ຖʹ୶ʑͱϥϕϧΛ͚ͭΔ ⾣ ӳจͱͯ͠ͷྲྀΕ͸ҙࣝ͠ͳͯ͘ྑ͍ struct Person { init(name: String, number: Int) { } ӳจͷྲྀΕ͸ҙࣝ͠ͳͯ͘ྑ͍ init(havingName: String, andNumber: Int) { } ͜Μͳ෩ʹ‫ؤ‬ுΒͳͯ͘ྑ͍

16.

ΠχγϟϥΠβʔͷ໋໊‫ن‬ଇ ஋อଘͷ‫ܕ‬ม‫Ͱ׵‬ͷ໋໊‫ن‬ଇ ⾣ 4XJGUͰ͸ΠχγϟϥΠβʔͰ‫ܕ‬ม‫׵‬Λߦ͏ ⾣ ‫׳‬शͱͯ͠ɺ࠷ॳͷҾ਺ʹϥϕϧΛ͚ͭͳ͍ struct Number { init( _ string: String, radix: Int) { *OU͔Β/VNCFS΁ͷ7BMVF1SFTFSWJOH5ZQF$POWFSTJPOΛද‫ݱ‬ }

17.

ΠχγϟϥΠβʔͷ໋໊‫ن‬ଇ ղऍΛ൐͏‫ܕ‬ม‫Ͱ׵‬ͷ໋໊‫ن‬ଇ ⾣ ͞·͟·ͳղऍΛ൐͏‫ܕ‬ม‫׵‬ ⾣ ม‫ํ׵‬๏Λ࠷ॳͷϥϕϧͰઆ໌͢Δ struct WebSite { init(url: String, baseAddress: URL? = nil) { 63-͔Βॳ‫ظ‬Խ͢Δ/BSSPXJOH5ZQF$POWFSTJPOΛද‫ݱ‬ }

18.

‫ʹܕ‬ΑͬͯมΘΔੑ֨  ஋‫ܕ‬ͷΠχγϟϥΠβʔ  ࢀর‫ܕ‬ͷΠχγϟϥΠβʔ

19.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ ஋‫ܕ‬ͷΠχγϟϥΠβʔ ⾣ ஋‫ܕ‬͸σʔλߏ଄Λද‫͢ݱ‬Δ ⾣ σʔλྖҬΛॳ‫ظ‬Խ͢Δͷ͕໨త  ΠχγϟϥΠβʔ *OJUJBMJ[FS  ϝϯόʔϫΠζΠχγϟϥΠβʔ .FNCFSXJTF*OJUJBMJ[FS

20.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ʢ஋‫ܕ‬ʣ ΠχγϟϥΠβʔ ⾣ σʔλͷॳ‫ظ‬஋Λܾఆ͢ΔΠχγϟϥΠβʔ ⾣ อଘ‫ܕ‬ϓϩύςΟʔશͯʹ஋Λઃఆ͢Δ struct Person { var name: String var number: Int init(name: String) { self.name = name self.number = getNextNumber() }

21.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ʢ஋‫ܕ‬ʣ .FNCFSXJTFΠχγϟϥΠβʔ ⾣ શͯͷอଘ‫ܕ‬ϓϩύςΟʔΛड͚औͬͯॳ‫ظ‬Խ ⾣ ‫ܕ‬ຊମʹJOJU࣮૷Λলུ͢Δͱࣗಈ࣮૷͞ΕΔ struct Person { var name: String var number: Int } // イニシャライザーを定義しなくても使える let someone = Person(name: "Kumagai", number: 2)

22.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ʢ஋‫ܕ‬ʣ ஋‫Ͱܕ‬ΠχγϟϥΠβʔΛ֦ு ⾣ FYUFOTJPOͰΠχγϟϥΠβʔΛ֦ுͰ͖Δ ⾣ ஋Λॳ‫ظ‬Խͨ͠ΓɺผͷJOJUΛ‫ݺ‬ΜͩΓͰ͖Δ struct Person { var name: String var number: Int } extension Person { init(name: String) { self.init(name: name, number: getNextNumber()) }

23.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ ࢀর‫ܕ‬ͷΠχγϟϥΠβʔ ⾣ ࢀর‫ܕ‬͸ɺঢ়ଶΛ‫ڞ‬༗؅ཧ͢ΔΦϒδΣΫτ ⾣ JOJUͷ໨తʹɺΦϒδΣΫτ੍‫ޚ‬ͷ‫఺؍‬΋ՃΘΔ  ࢦఆΠχγϟϥΠβʔ %FTJHOBUFE*OJUJBMJ[FS  ศٓΠχγϟϥΠβʔ $POWFOJFODF*OJUJBMJ[FS  ඞਢΠχγϟϥΠβʔ 3FRVJSFE*OJUJBMJ[FS

24.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ʢࢀর‫ܕ‬ʣ ࢦఆΠχγϟϥΠβʔ ⾣ ॳ‫ظ‬Խͷॏཁͳ໾ׂΛ୲͏ΠχγϟϥΠβʔ ⾣ ‫ܧ‬ঝઌͰΦʔόʔϥΠυͰ͖Δ ⾣ ‫ܧ‬ঝઌͰ৽ͨʹ࣮૷͢Δͱɺ਌ͷJOJUΛӅṭ͢Δ w ΦʔόʔϥΠυ͚ͩͳΒ਌ͷଞJOJU͸Ӆṭ͠ͳ͍ class Base { init(name: String, number: Int) { } }

25.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ʢࢀর‫ܕ‬ʣ ศٓΠχγϟϥΠβʔ ⾣ ࠷‫ޙ‬͸ଞͷࢦఆΠχγϟϥΠβʔ‫ͼݺ‬ग़͢ඞཁ͕͋Δ ⾣ ‫ܧ‬ঝઌͰΦʔόʔϥΠυͰ͖ͳ͍ ⾣ ‫ܧ‬ঝઌͰ৽ͨʹ࣮૷ͯ͠΋ɺ਌ͷJOJUΛӅṭ͠ͳ͍ class Base { convenience init(name: String) { self.init(name: name, number: getNextNumber()) } }

26.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ʢࢀর‫ܕ‬ʣ ඞਢΠχγϟϥΠβʔ ⾣ ࢦఆΠχγϟϥΠβʔͱಉ౳ͷ໾ׂ ⾣ ‫ܧ‬ঝઌͰΦʔόʔϥΠυ͠ͳ͚Ε͹͍͚ͳ͍ ⾣ Ӆṭ͞Εͳ͚Ε͹ɺΦʔόʔϥΠυ͸লུՄೳ class Base { required init(name: String, number: Int) { } }

27.

‫ʹܕ‬ΑͬͯมΘΔੑ֨ʢࢀর‫ܕ‬ʣ ࢀর‫ܕ‬ͷ֦ுͰ࢖͑Δ΋ͷ ⾣ ศٓΠχγϟϥΠβʔΛ֦ுͰ͖Δ ⾣ ࢦఆJOJU΍ඞਢJOJU͸֦ுͰ͖ͳ͍ extension Object { convenience init(a: Int) { … } 0, init(b: Int) { … } EFTJHOBUFEJOJUJBMJ[FSNVTUCFEFDMBSFEEJSFDUMZJO required nit(c: Int) { … } SFRVJSFEJOJUJBMJ[FSNVTUCFEFDMBSFEEJSFDUMZJODMBTT

28.

JOJUͷ֎ଆ͔Βͷॳ‫ظ‬Խ  ϓϩύςΟʔʹ‫ط‬ఆ஋Λઃఆ  ‫ط‬ఆ஋Ͱॳ‫ظ‬Խ͢Δͱ͖ͷ஫ҙ  .FNCFSXJTFJOJUͱ‫ط‬ఆ஋

29.

JOJUͷ֎͔Β΋ॳ‫ظ‬ԽͰ͖Δ ϓϩύςΟʔʹ‫ط‬ఆ஋Λઃఆ ⾣ อଘ‫ܕ‬ϓϩύςΟʔʹॳ‫ظ‬஋ΛࢦఆͰ͖Δ ⾣ JOJU͕‫ݺ‬͹ΕΔલʹઃఆ͞ΕΔ class View { var textColor = NSColor.black var backgroundColor = NSColor.white init() { } } JOJU಺Ͱॳ‫ظ‬Խ͠ͳͯ͘΋0,

30.

JOJUͷ֎͔Β΋ॳ‫ظ‬ԽͰ͖Δ ‫ط‬ఆ஋Ͱॳ‫ظ‬Խ͢Δͱ͖஫ҙ ⾣ ‫ݪ‬ଇɺͲΜͳ৔߹Ͱ΋ॳ‫ظ‬Խ͞ΕΔ ⾣ JOJU಺Ͱॳ‫ظ‬Խ͢Δͱɺ̎ճॳ‫ظ‬Խ͞ΕΔ class Object { var value = Value() JOJUલʹॳ‫ظ‬Խ͞ΕΔ init() { value = Value() } } JOJU಺Ͱॳ‫ظ‬Խ͢Δͱɺॳ‫ظ‬஋Λ্ॻ

31.

JOJUͷ֎͔Β΋ॳ‫ظ‬ԽͰ͖Δ .FNCFSXJTFJOJUͱ‫ط‬ఆ஋ ⾣ .FNCFSXJTFJOJU͸‫ط‬ఆ஋Λແࢹ͢Δ ⾣ ࣗ෼Ͱಉ౳ͷJOJUΛ࡞Δͱɺॳ‫ظ‬Խ͕ॏෳ struct Data { var value = Value() } ‫ط‬ఆ஋͕ઃఆ͞Ε͍ͯͯ΋ʜ let data = Data(value: Value()) ϝϯόʔϫΠζΠχγϟϥΠβʔͳΒ‫ط‬ఆ஋͸࢖ΘΕͳ͍

32.

.FNCFSXJTFΠχγϟϥΠβʔ  ࣗಈ࣮૷͞Εͳ͍ͱ͖  ࣗಈ࣮૷͞ΕΔͱ͖  ϓϩύςΟʔ͕‫ط‬ఆ஋Λ࣋ͭͱ͖  QVCMJDʹఏ‫͖ͱ͍ͨ͠ڙ‬͸ʜ

33.

.FNCFSXJTFΠχγϟϥΠβʔ ࣗಈ࣮૷͞Εͳ͍ͱ͖ ⾣ ‫ܕ‬ຊମʹಠࣗʹJOJUΛ࣮૷ͨ͠ͱ͖ ⾣ ಠࣗʹ࣮૷ͨ͠΋ͷ͚͕ͩར༻Ͱ͖Δ struct Person { var name: String var number: Int init(name: String) { self.name = name self.number = getNextNumber() } }

34.

.FNCFSXJTFΠχγϟϥΠβʔ ࣗಈ࣮૷͞ΕΔͱ͖ ⾣ ‫ܕ‬ຊମʹJOJUΛ࣮૷͠ͳ͍ͱ͖ ⾣ ‫֦ܕ‬ுͰ࣮૷ͨ͠JOJUʹ͸Ө‫͞ڹ‬Εͳ͍ struct Person { var name: String var number: Int } extension Persion { init(name: String) { self.name = name self.number = getNextNumber() }

35.

.FNCFSXJTFΠχγϟϥΠβʔ ϓϩύςΟʔ͕‫ط‬ఆ஋Λ࣋ͭͱ͖ ⾣ શͯΛઃఆ͢Δ.FNCFSXJTFJOJU͕ఏ‫͞ڙ‬ΕΔ ⾣ શͯΛলུͨ͠৔߹ͷJOJU΋ఏ‫͞ڙ‬ΕΔ struct RandomGenerator { var seed1: UInt32 = arc4random() var seed2: UInt32 = arc4random() } let gen1 = RandomGenerator() let gen2 = RandomGenerator(seed1: 0, seed2: 1)

36.

.FNCFSXJTFΠχγϟϥΠβʔ .FNCFSXJTFJOJUͷΞΫηεൣғ ⾣ ‫ط‬ఆͰ͸JOUFSOBMΞΫηε ⾣ JOUFSOBMະຬͷϓϩύςΟʔΛ࣋ͭ৔߹ɺ ΞΫηεൣғ͸͍ͪ͹Μ௿͍΋ͷʹἧ͑ΒΕΔ ⾣ ϓϩύςΟʔ͕શͯQVCMJDͰ΋ɺ .FNCFSXJTFΠχγϟϥΠβʔ͸JOUFSOBM

37.

.FNCFSXJTFΠχγϟϥΠβʔ QVCMJDʹఏ‫͖ͱ͍ͨ͠ڙ‬͸ʜ  ಉ౳ͷJOJUΛಠࣗఆٛ͢ΔҊ  ‫֦ܕ‬ுͰத‫͢ܧ‬ΔҊ

38.

.FNCFSXJTFΠχγϟϥΠβʔ ಉ౳ͷJOJUͰQVCMJDఏ‫͢ڙ‬ΔҊ ⾣ ඪ४ͷ.FNCFSXJTFJOJUͱಉ౳ʹར༻Ͱ͖Δ ⾣ ‫ط‬ఆ஋෇͖ͷϓϩύςΟʔ͸ॏෳॳ‫ظ‬Խ͞ΕΔͷͰ஫ҙ public struct MyData { public var value = MyValue() public init(value: MyValue) { self.value = value } }

39.

.FNCFSXJTFΠχγϟϥΠβʔ ֦ுJOJUͰQVCMJDఏ‫͢ڙ‬ΔҊ ⾣ ඪ४ͷ.FNCFSXJTFJOJUΛͦͷ··࢖͏ ⾣ ॏෳॳ‫ظ‬ԽΛճආͰ͖Δ͕ɺϥϕϧ͸িಥճආ͕ඞཁ public struct MyData { public var value = MyValue() } extension MyData { public init(memberwiseWithValue value: MyValue) { self.init(value: value) } }

40.

.FNCFSXJTFΠχγϟϥΠβʔ Φεεϝ͍ͨ͠ଥ‫ڠ‬Ҋ ⾣ ϓϩύςΟʔͷ௚઀ॳ‫ظ‬ԽΛ΍ΊΔ ⾣ .FNCFSXJTFJOJUಉ౳ͷJOJUΛಠ࣮ࣗ૷͢Δ public struct MyData { public var value: MyValue public init(value: MyValue) { self.value = value } }

41.

ΠχγϟϥΠβʔͷ‫ͼݺ‬ग़͠  ‫ʹ໊ܕ‬Ҿ਺Λ౉͢ํ๏  ‫ܕ‬JOJUΛ࢖͏ํ๏

42.

ΠχγϟϥΠβʔͷ‫ͼݺ‬ग़͠ ‫ʹ໊ܕ‬Ҿ਺Λ౉͢ํ๏ ⾣ ‫ʹ໊ܕ‬Ҿ਺ϦετΛఴ͑ͯ‫ͼݺ‬ग़͢ ⾣ ֘౰͢ΔJOJU͕‫ͼݺ‬ग़͞ΕΔ let speaker = Person("Kumagai", 1234)

43.

ΠχγϟϥΠβʔͷ‫ͼݺ‬ग़͠ ‫ܕ‬JOJUΛ࢖͏ํ๏  ⾣ ‫ʹ໊ܕ‬JOJUΛ໌‫ͼݺͯ͠ه‬ग़͢ ⾣ ؔ਺‫ܕ‬ม਺ʹ֨ೲͯ͠࢖͑Δ let h = Person.init(name: "Kumagai", number: 1234) // 関数型変数 f にイニシャライザーを入れて使える let f: (String,Int) -> Person = Person.init(name:number:) let someone = f("Kumagai", 1234)

44.
[beta]
ΠχγϟϥΠβʔͷ‫ͼݺ‬ग़͠

‫ܕ‬JOJUΛ࢖͏ํ๏ 
⾣

‫ܕ‬ਪ࿦Ͱ‫͖Ͱ༻׆‬Δ

⾣

લ‫͔ޙ‬Βਪ࿦ͯ͠JOJUΛ‫͚ͯͭ͘ݟ‬ΕΔ

// 取り得る型から推論する

let list = MemberList(persons: .init(name: "A"))
// 関数内で、戻り値の型から推論する

func makePerson(name: String) -> Person {
return .init(name: name)
}

45.

ϓϩτίϧͰJOJUΛ‫ن‬ఆ  ϓϩτίϧͰ࣮૷Λٛ຿෇͚Δ

46.

ϓϩτίϧͰJOJUΛ‫ن‬ఆ ϓϩτίϧͰ࣮૷Λٛ຿෇͚Δ  ⾣ ϓϩτίϧʹJOJUΛ‫ن‬ఆͰ͖Δ ⾣ ‫ن‬ఆͨ͠JOJU͸ɺඞਢΠχγϟϥΠβʔ૬౰ protocol ExpressibleByName { init(name: String) }

47.

ϓϩτίϧͰJOJUΛ‫ن‬ఆ ϓϩτίϧͰ࣮૷Λٛ຿෇͚Δ  ⾣ ஋‫ܕ‬͸ɺී௨ʹJOJUͰద߹͢Δ ⾣ ࢀর‫ܕ‬͸ɺSFRVJSFEJOJUͰద߹͢Δ // 値型をプロトコルに適合させるとき struct Person : ExpressibleByName { init(name: String) { … } } // 参照型をプロトコルに適合させるとき class Thread : ExpressibleByName { required init(name: String) { … } }

48.

ϓϩτίϧͰJOJUΛ‫ن‬ఆ Ϋϥε֦ுͰ͸ద߹Ͱ͖ͳ͍ ⾣ ϓϩτίϧ͕‫ٻ‬ΊΔJOJU͸SFRVJSFE૬౰ ⾣ ࢀর‫ܕ‬͸ɺ‫֦ܕ‬ுͰϓϩτίϧʹద߹Ͱ͖ͳ͍ // 値型はプロトコルに適合できる extension Person : ExpressibleByName { init(name: String) { … } } // 参照型はプロトコルに適合できない extension Thread : ExpressibleByName { required init(name: String) { … } } SFRVJSFEJOJUJBMJ[FSNVTUCFEFDMBSFEEJSFDUMZJODMBTT

49.

ϝλλΠϓͰॳ‫ظ‬Խ͢Δ  ஋‫ܕ‬ͷΠχγϟϥΠβʔΛϝλλΠϓ͔Β࢖͏  ࢀর‫ܕ‬ͷΠχγϟϥΠβʔΛϝλλΠϓ͔Β࢖͏

50.

ϝλλΠϓͰॳ‫ظ‬Խ͢Δ ஋‫ܕ‬ͷJOJUΛϝλλΠϓ͔Β࢖͏ ⾣ ‫ܕ‬ͷϝλλΠϓ͸型.selfͰऔΓग़ͤΔ ⾣ ϝλλΠϓ͔ΒinitΛ‫ͼݺ‬ग़ͤΔ struct Value { init() { … } } // メタタイプ型の変数に保存して … let type: Value.Type = Value.self // そこからインスタンスを生成できる let instance: Value = type.init()

51.

ϝλλΠϓͰॳ‫ظ‬Խ͢Δ ࢀর‫ܕ‬ͷJOJUΛϝλλΠϓ͔Β࢖͏ ⾣ ࢀর‫ܕ‬͸SFRVJSFEJOJU͚͕ͩ‫ͼݺ‬ग़ͤΔ ⾣ ͦ͏Ͱͳ͍ͱɺ‫ܧ‬ঝઌͷJOJUͷଘࡏΛอূͰ͖ͳ͍ class Object { required init(a: Int) {} init(b: Int) {} } let type: Object.Type = Object.self let a = type.init(a: 0) let b = type.init(b: 0) 0, DPOTUSVDUJOHBOPCKFDUPGDMBTTUZQF0CKFDUXJUIBNFUBUZQF WBMVFNVTUVTFBSFRVJSFEJOJUJBMJ[FS

52.

ϝλλΠϓͰॳ‫ظ‬Խ͢Δ ϙϦϞʔϑΟζϜ΋ߟྀ͞ΕΔ ⾣ ‫ج‬ఈͷϝλλΠϓʹɺ೿ੜઌͷΛೖΕΒΕΔ ⾣ ‫ܧ‬ঝؔ܎Λߟྀͯ͠JOJU͕‫ݺ‬͹ΕΔ class Base { required init() { … } } class Sub : Base { required init() { … } } let types = [Base.self, Sub.self] as [Base.Type] let instances = types.map { $0.init() }

53.

࠷‫ʹޙ‬એ఻

54.

!ौ୩DBGF "QQMF5IF4XJGU1SPHSBNNJOH-BOHVBHFΛࢀߟʹ 4XJGUͷখ͞ͳࣄฑΛ޿͍ࢹ఺ͰோΊͯΈΔձ ࠓճͷൃදΈ͍ͨͳ࿩Λ࣌ؒ͘Β͍͔͚ͯ ΈΜͳͱΘ͍Θ͍ஊসͯ͠·͢ʂ IUUQTDTXJGUDPOOQBTTDPN NJOOB@EF@TXJGU

55.

&OKPZ4XJGU 5IBOLZPV ΠχγϟϥΠβʔ෮शձ ‫۽‬୩༑޺ !FT@LVNBHBJ ⾣ ֓ཁ ⾣ ໋໊‫ن‬ଇ ⾣ ‫ʹܕ‬ΑͬͯมΘΔੑ֨ ⾣ ‫ͼݺ‬ग़͠ ⾣ JOJU֎͔Βͷॳ‫ظ‬Խ ⾣ .FNCFSXJTFΠχγϟϥΠβʔ ⾣ ϓϩτίϧͰJOJUΛ‫ن‬ఆ ⾣ ϝλλΠϓ͔Βॳ‫ظ‬Խ͢Δ