Slide 1

Slide 1 text

SwiftͱΠχγϟϥΠβ 2017-11-28 @snakagam / Shota Nakagami

Slide 2

Slide 2 text

࿩͢಺༰ 4 Swiftͷجຊతͳ಺༰ʮΠχγϟϥΠβʯʹ͍ͭͯ 4 ΠχγϟϥΠβͱܕͷؔ܎ʢΫϥεɺߏ଄ମɺྻڍମʣ 4 ΠχγϟϥΠβͷछྨͱઆ໌

Slide 3

Slide 3 text

࣍ͷΩʔϫʔυ͕ϞϠͬͱ͍ͯ͠Δํʹ͓͢͢Ί! 4 Failable Initilizer/ࣦഊՄೳΠχγϟϥΠβ 4 Default Initializer/طఆΠχγϟϥΠβ 4 Memberwise Initilaizer/શ߲໨ΠχγϟϥΠβ 4 Designated Initializer/ࢦఆΠχγϟϥΠβ 4 Convenience Initializer/؆қΠχγϟϥΠβ 4 Required Initializer/ඞਢΠχγϟϥΠβ

Slide 4

Slide 4 text

ΠχγϟϥΠβͱ͸ 4 ܕʢΫϥεɺߏ଄ମɺྻڍମʣͷΠϯελϯεΛॳظԽ ʢinitializeʣ͢Δಛघͳϝιουͷ͜ͱ 4 AppleެࣜϦϑΝϨϯεʛInitialization init() { // ॳظԽ }

Slide 5

Slide 5 text

ΠχγϟϥΠβͷه๏ class MyClass { let a: Int // func͕ෆཁʢinitΩʔϫʔυͷΈʣ init(a: Int) { self.a = a } } let case1 = MyClass.init(a: 0) // ݺͼग़࣌͠ͷϝιου໊͕লུՄೳ let case2 = MyClass(a: 0)

Slide 6

Slide 6 text

ͳͥॳظԽ͕ඞཁͳͷʁ ϓϩύςΟ͕ਖ਼͘͠ॳظԽͰ͖ͳ͍৔߹... 4 ܕͷ੔߹ੑ͕औΕͳ͍ 4 ϝϞϦ҆શͰͳ͍ʢϝϞϦ֬อɺॳظԽʣ

Slide 7

Slide 7 text

Swift͸҆શ C΍ObjC 4 ڧҾʹ0΍falseɺNULLͰॳظԽʢόάͷݩʣ Swift 4 ܕͷ੔߹ੑɺॳظԽ͸ίϯύΠϥʹΑͬͯ੩తʹνΣοΫ

Slide 8

Slide 8 text

ίϯύΠϧΤϥʔͷྫ OptionalͰͳ͍ͷʹname͸࣮࣭nilʢܕͷෆ੔߹ʣ class Book { let name: String // ॳظԽ͞Ε͍ͯͳ͍ init(name: String) { // ίϯύΠϧΤϥʔ // return from initializer without initializing all stored properties } }

Slide 9

Slide 9 text

SwiftΫΠζ ͲͷϓϩύςΟΛॳظԽ͢Δඞཁ͕͋Δʁ!

Slide 10

Slide 10 text

class MyClass { let a: Int let b: Int = 0 let c: Int? let d: Int? = 0 var e: Int var f: Int = 0 var g: Int? var h: Int? = 0 var i: Int { return 0 } var j: Int? { return 0 } init() { // ͲͷϓϩύςΟΛॳظԽ͢Δ??? } }

Slide 11

Slide 11 text

ਖ਼ղ͸...

Slide 12

Slide 12 text

class MyClass { let a: Int // ॳظԽ͕ඞཁʂ let b: Int = 0 let c: Int? // ॳظԽ͕ඞཁʂ let d: Int? = 0 var e: Int // ॳظԽ͕ඞཁʂ var f: Int = 0 var g: Int? var h: Int? = 0 var i: Int { return 0 } var j: Int? { return 0 } init() { a = 0 c = 0 e = 0 } }

Slide 13

Slide 13 text

ΠχγϟϥΠβ಺ͰॳظԽͷཁ൱ SwiftΫΠζͷ֤ϓϩύςΟΛ෼ྨ͢Δͱɾɾɾʁ

Slide 14

Slide 14 text

// ʢෆཁʣίϯϐϡʔςουϓϩύςΟ var i: Int { return 0 } var j: Int? { return 0 } // ʢෆཁʣσϑΥϧτ஋͋ΓͷετΞυϓϩύςΟ let b: Int = 0 let d: Int? = 0 var f: Int = 0 var h: Int? = 0 // ʢෆཁʣOptionalܕͷม਺ετΞυϓϩύςΟ // ˒҉໧తʹnil͕σϑΥϧτ஋ͱͯ͠ઃఆ͞ΕΔ var g: Int? // ʢඞཁʣσϑΥϧτ஋ͳ͠ɺඇΦϓγϣφϧͷม਺ετΞυϓϩύςΟ var e: Int // ʢඞཁʣσϑΥϧτ஋ͳ͠ͷఆ਺ετΞυϓϩύςΟ let a: Int let c: Int?

Slide 15

Slide 15 text

ม਺ϓϩύςΟͷ҉໧తͳnil୅ೖ 4 σϑΥϧτ஋ͳ͠ͷOptionalͷετΞυϓϩύςΟʹؔ͠ ͯ͸ఆ਺͔ม਺͔ʹΑͬͯڍಈ͕ҟͳΔ 4 ม਺ͷ৔߹͸҉໧తʹnil͕୅ೖ͞ΕΔ 4 ఆ਺͸nil͕୅ೖ͞Εͳ͍ ʢ҉໧తʹnilΛ୅ೖͯ͠΋ɺมߋ͕Ͱ͖ͳ͍ͨΊʣ

Slide 16

Slide 16 text

ॳظԽཁ൱Λ·ͱΊΔͱ...

Slide 17

Slide 17 text

ॳظԽཁ൱ ϓϩύςΟछผ ิ଍આ໌ ඞཁ σϑΥϧτ஋ͳ͠ɺఆ਺ετΞυ ϓϩύςΟ - ඞཁ σϑΥϧτ஋ͳ͠ɺඇΦϓγϣφ ϧͷม਺ετΞυϓϩύςΟ - - Optionalܕͷม਺ετΞυϓϩ ύςΟ ҉໧తʹnilͰॳظԽ͞ΕΔ - σϑΥϧτ஋͋ΓͷετΞυϓϩ ύςΟ σϑΥϧτ஋ͰॳظԽ͞ΕΔ - ίϯϐϡʔςουϓϩύςΟ ஋Λอ࣋͠ͳ͍ͷͰॳظԽ͕ෆ ཁ

Slide 18

Slide 18 text

Ϋϥεɾߏ଄ମɾྻڍମ ڞ௨ͷΠχγϟϥΠβ

Slide 19

Slide 19 text

ࣦഊՄೳΠχγϟϥΠβʛFailable Initilizer 4 ॳظԽʹࣦഊ͢ΔՄೳੑͷ͋Δinitilizer 4 ໭Γ஋͸OptionalܕʢॳظԽʹࣦഊͨ͠৔߹ʹnilΛฦ͢ʣ

Slide 20

Slide 20 text

class WebPage { let title: String let url: URL init?(title: String, urlString: String) { // URLจࣈྻΛURLʹม׵Ͱ͖ͳ͍৔߹͸ॳظԽΛࣦഊͤ͞Δ guard let url = URL(string: urlString) else { return nil } self.title = title self.url = url } }

Slide 21

Slide 21 text

طఆΠχγϟϥΠβʛDefault Initializer 4 ϓϩύςΟͷॳظԽ͕ෆཁͳ৔߹ʹ҉໧తʹఆٛ͞ΕΔ

Slide 22

Slide 22 text

class MyClass { var name: String = "MyClass" var number: Int = 0 // ҉໧తʹinit()͕࣮૷͞ΕΔ } let myClass = MyClass()

Slide 23

Slide 23 text

ߏ଄ମͷΠχγϟϥΠβ

Slide 24

Slide 24 text

શ߲໨ΠχγϟϥΠβʛMemberwise Initilaizer 4 structͰ҉໧తʹఆٛ͞ΕΔΠχγϟϥΠβ 4 ϓϩύςΟ͕ଟ͍৔߹ʹɺΠχγϟϥΠβΛ࣮૷͢Δखؒ ͕ল͚Δ

Slide 25

Slide 25 text

struct Book { let id: String let title: String var price: Int // ΠχγϟϥΠβ͸࣮૷͍ͯ͠ͳ͍ } let book = Book(id: "001", title: "SwiftyBook", price: 1500)

Slide 26

Slide 26 text

ྑ͍!!!

Slide 27

Slide 27 text

ɺ͕ଞʹΠχγϟϥΠβͭ͘Δͱར༻ෆՄ!

Slide 28

Slide 28 text

ɺ͕extentionͰճආՄ

Slide 29

Slide 29 text

struct Book { let id: String let title: String var price: Int } // ಠࣗΠχγϟϥΠβΛextensionʹهࡌ extension Book { init() { id = "000" title = "λΠτϧͳ͠" price = 0 } } let book1 = Book(id: "001", title: "SwiftyBook", price: 1500) let book2 = Book()

Slide 30

Slide 30 text

ͨͩ͠ΞΫηεϨϕϧ͸internal ϥΠϒϥϦԽͱ͔ͰผϞδϡʔϧʹ͢ΔͱΞΫηεͰ͖ͳ͍ͷ Ͱ஫ҙ

Slide 31

Slide 31 text

ྻڍମͷΠχγϟϥΠβ

Slide 32

Slide 32 text

ྻڍମͷϝϯό໊ͰॳظԽ enum͸ετΞυϓϩύςΟΛ࣋ͨͳ͍ͨΊɺॳظԽ͸؆୯ enum TrafficSignal { case green case yellow case red } let signal: TrafficSignal = .green

Slide 33

Slide 33 text

ΧελϜΠχγϟϥΠβ 4 ΠχγϟϥΠβ಺Ͱɺselfʹ஋Λ୅ೖ͢Δ enum TrafficSignal { case green case yellow case red init() { self = .red } } // .red let signal = TrafficSignal()

Slide 34

Slide 34 text

raw value͕ఆٛ͞Ε͍ͯΔ৔߹ ࣦഊՄೳΠχγϟϥΠβ͕҉໧తʹఆٛ͞ΕΔ enum TrafficSignal: String { case green case yellow case red // ࣦഊՄೳΠχγϟϥΠβ͕҉໧తʹఆٛ͞ΕΔ } let signal = TrafficSignal(rawValue: "yellow")

Slide 35

Slide 35 text

ΫϥεͷΠχγϟϥΠβ

Slide 36

Slide 36 text

ܧঝͷಛ௃Λ࣋ͭͨΊɺ֤Ϋϥε֊૚Ͱఆٛ͞ΕͨϓϩύςΟ ͕ॳظԽ͞ΕΔ͜ͱΛอূ͢Δඞཁ͕͋Δ

Slide 37

Slide 37 text

ͦͷͨΊɺ֤ΠχγϟϥΠβͷϧʔϧ͕͍Ζ͍Ζ 4 ࢦఆΠχγϟϥΠβ 4 ؆қΠχγϟϥΠβ

Slide 38

Slide 38 text

ࢦఆΠχγϟϥΠβʛDesignated Initializer 4 ඞਢͷΠχγϟϥΠβ 4 શͯͷετΞυϓϩύςΟΛॳظԽ͢Δ 4 ܧঝ͍ͯ͠Δ৔߹͸ɺॳظԽޙʹεʔύʔΫϥεͷࢦఆΠ χγϟϥΠβΛݺͿ

Slide 39

Slide 39 text

class Book { let title: String let price: Int // ࢦఆΠχγϟϥΠβ init(title: String, price: Int) { self.title = title self.price = price } } class Ebook: Book { var urlString: String // ࢦఆΠχγϟϥΠβ init(title: String, price: Int, urlString: String) { self.urlString = urlString super.init(title: title, price: price) } }

Slide 40

Slide 40 text

؆қΠχγϟϥΠβʛConvenience Initializer 4 ඞਢͰͳ͍ʢॳظԽॲཧΛศརʹ͢ΔͨΊͷΠχγϟϥΠ βʣ 4 ࢦఆΠχγϟϥΠβΛϥοϓ͠ɺ಺෦ͰݺͿ 4 ಉҰΫϥεͷΠχγϟϥΠβΛݺͼɺ࠷ऴతʹࢦఆΠχγ ϟϥΠβΛݺΜͰ΋OK 4 ࠷ऴతʹࢦఆΠχγϟϥΠβͰॳظԽ͢Δඞཁ͕͋Δͨ Ίɺఆ਺ϓϩύςΟ͸؆қΠχγϟϥΠβͰॳظԽͰ͖ͳ

Slide 41

Slide 41 text

class Book { let title: String let price: Int // ࢦఆΠχγϟϥΠβ init(title: String, price: Int) { self.title = title self.price = price } } class Ebook: Book { var urlString: String // ࢦఆΠχγϟϥΠβ init(title: String, price: Int, urlString: String) { self.urlString = urlString super.init(title: title, price: price) } // ؆қΠχγϟϥΠβ convenience init(title: String, price: Int, url: URL) { self.init(title: title, price: price, urlString: url.absoluteString) } }

Slide 42

Slide 42 text

Πϝʔδਤ ֤Ϋϥε֊૚ͰॳظԽ͕ߦΘΕΔྲྀΕ

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

ඞਢΠχγϟϥΠβʛRequired Initializer 4 requiredΩʔϫʔυͷ͍ͭͨΠχγϟϥΠβ͕͋Δ৔߹ɺ αϒΫϥεͰͷ࣮૷͕ඞਢͱͳΔ 4 αϒΫϥεଆͰ͸overrideͷهड़͸ෆཁͰrequiredͷΈه ड़͢Δʢࣗ໌ͳͨΊʣ

Slide 45

Slide 45 text

class MyView: UIView { // ࢦఆΠχγϟϥΠβ override init(frame: CGRect) { super.init(frame: frame) } // ؆қΠχγϟϥΠβ convenience init() { self.init(frame: .zero) } // ඞਢΠχγϟϥΠβ required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } }

Slide 46

Slide 46 text

ϓϩτίϧͰΠχγϟϥΠβΛఆٛͨ͠৔߹ɺͦͷϓϩτίϧ ʹ४ڌ͢ΔΫϥεͰͷΠχγϟϥΠβ࣮૷͸ඞਢΠχγϟϥΠ βͱͳΔ protocol MyProtocol { var stringValue: String { get set } // required͸ࢦఆ͍ͯ͠ͳ͍ init(intValue: Int) } class MyClass: MyProtocol { var stringValue: String // required͕ඞཁ required init(intValue: Int) { stringValue = String(intValue) } }

Slide 47

Slide 47 text

͋·Γ࢖Θͳ͍͔΋

Slide 48

Slide 48 text

·ͱΊ

Slide 49

Slide 49 text

ར༻Մೳͳܕ छผ આ໌ ڞ௨ Failable Initilizer/ࣦഊՄೳΠχγϟϥΠβ ॳظԽʹࣦഊ͢ΔՄೳੑͷ͋ΔΠχγϟϥ Πβ ڞ௨ Default Initializer/طఆΠχγϟϥΠβ ॳظԽ͕ෆཁͳ৔߹ʹ҉໧తʹ࣮૷͞ΕΔ ΠχγϟϥΠβ ߏ଄ମ Memberwise Initilaizer/શ߲໨Πχγϟϥ Πβ ߏ଄ମͰશͯͷετΞυϓϩύςΟΛॳظԽ ͢ΔΑ͏҉໧తʹ࣮૷͞ΕΔΠχγϟϥΠ β Ϋϥε Designated Initializer/ࢦఆΠχγϟϥΠ β શͯͷετΞυϓϩύςΟΛॳظԽ͠ɺ਌Ϋ ϥε͕͋Ε͹਌ΫϥεͷࢦఆΠχγϟϥΠβ Λ࣮ߦ͢ΔɺඞਢͷΠχγϟϥΠβ Ϋϥε Convenience Initializer/؆қΠχγϟϥΠ β ࢦఆΠχγϟϥΠβΛϥοϓ͢Δɺ೚ҙͷΠ χγϟϥΠβ ྻڍମ Required Initializer/ඞਢΠχγϟϥΠβ αϒΫϥεͰͷΠχγϟϥΠβͷ࣮૷Λඞਢ ͱ͢ΔΠχγϟϥΠβ

Slide 50

Slide 50 text

ࢀߟ 4 Swift࣮ફೖ໳ʢhttp://gihyo.jp/book/ 2017/978-4-7741-8730-3ʣ 4 ৄղSwiftʢhttp://www.sbcr.jp/products/ 4797390537.htmlʣ 4 ͠Ίḉ೔هʛSwiftͷϓϩύςΟʔͱॳظԽͱ Convenience initializer

Slide 51

Slide 51 text

͓ΘΓ ͋Γ͕ͱ͏͍͟͝·ͨ͠!!!