Slide 1

Slide 1 text

4XJGUͰ
 ؾ࣋ͪྑ͘։ൃ͢Δ !)FBMUI4XJGU.FFUVQ F[VSB

Slide 2

Slide 2 text

4XJGUͷදݱྗɺؾ࣋ͪྑ͍ʂʂ

Slide 3

Slide 3 text

5...2

Slide 4

Slide 4 text

print(self) • ៸໘༑߳ (ezura) • ޷͖ͳ΋ͷ: protocol, enum • τϥΠϑΥʔτۈ຿ • twitter: @eduraaa

Slide 5

Slide 5 text

Ұϲ݄΄Ͳલʹ4XJGUѪ޷ձͱ͍͏ษڧձͰ
 ͓࿩͍͍ͤͯͨͩͨ͜͠͞ͱ

Slide 6

Slide 6 text

https://speakerdeck.com/ezura/swift-falseshi-jie-guan-to-sofalsezhi-xu 4XJGUͷੈք؍ͱͦͷடং 4XJGUͷඪ४ϥΠϒϥϦ ͱͷ஥ྑ͘ͳΓํ

Slide 7

Slide 7 text

for element in [1, 2, 3] { /* do something */ } [1, 2, 3].forEach { _ in /* do something */ } 1 ... 3 if array.isEmpty { /* do something */ } SequenceType
 (CollectionType) ForwardIndexType BooleanType Comparable IntegerLiteral
 Convertible ArrayLiteral
 Convertible

Slide 8

Slide 8 text

4XJGUΛܗ࡞Δཁૉɺඪ४ϥΠϒϥϦ ཧղ͢Ε͹ Swift ʹௐ࿨ͨ͠ίʔυΛؾ࣋ͪྑ͘ॻ͚ͦ͏ʂ

Slide 9

Slide 9 text

෼Ͱඪ४ϥΠϒϥϦͱ༡ΜͰΈΑ͏

Slide 10

Slide 10 text

5 ͔Β 2 ͷൣғ
 (Range) 5...2

Slide 11

Slide 11 text

for index in 1...5 { print("\(index) times 5 is \(index * 5)") } let names = ["Anna", "Alex", "Brian", "Jack"] let count = names.count for i in 0..

Slide 12

Slide 12 text

TUSVDU3BOHF&MFNFOU'PSXBSE*OEFY5ZQF *OU͸'PSXBSE*OEFY5ZQF
 ʹ४ڌ͍ͯ͠ΔͷͰѻ͑ͨ ݫີʹ͸ɺ*OU4JHOFE*OUFHFS5ZQFͰ͢ɻ
 ܧঝؔ܎͸4JHOFE*OUFHFS5ZQF*OUFHFS5ZQF 3BOEPN"DDFTT*OEFY5ZQF#JEJSFDUJPOBM*OEFY5ZQF 'PSXBSE*OEFY5ZQF 1...10 &MFNFOU

Slide 13

Slide 13 text

Represents a discrete value in a series QSPUPDPM'PSXBSE*OEFY5ZQF Value Value Value … …

Slide 14

Slide 14 text

Represents a discrete value in a series QSPUPDPM'PSXBSE*OEFY5ZQF 5 6 7 … … Equatable
 +
 func successor() -> Self

Slide 15

Slide 15 text

ࣗ࡞ͷܕʹ'PSXBSE*OEFY5ZQFΛ
 ४ڌͤ͞Δྫ

Slide 16

Slide 16 text

enum Week { case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } extension Week: ForwardIndexType { // ͜ͷ৔߹ͷ enum ͸ Hashable ʹ҉໧తʹ४ڌ͠·͢ɻ // protocol Hashable : Equatable ͳͷͰ͢Ͱʹ Equatable ʹ४ڌࡁΈͰ͢ɻ func successor() -> Week { switch self { case .Sunday: return .Monday case .Monday: return .Tuesday case .Tuesday: return .Wednesday case .Wednesday: return .Thursday case .Thursday: return .Friday case .Friday: return .Saturday case .Saturday: return self // ऴ୺ } } } 'PSXBSE*OEFY5ZQF ྫ Sunday Monday Tuesday … Saturday 8FFL

Slide 17

Slide 17 text

enum Week { case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } extension Week: ForwardIndexType { // ͜ͷ৔߹ͷ enum ͸ Hashable ʹ҉໧తʹ४ڌ͠·͢ɻ // protocol Hashable : Equatable ͳͷͰ͢Ͱʹ Equatable ʹ४ڌࡁΈͰ͢ɻ func successor() -> Week { switch self { case .Sunday: return .Monday case .Monday: return .Tuesday case .Tuesday: return .Wednesday case .Wednesday: return .Thursday case .Thursday: return .Friday case .Friday: return .Saturday case .Saturday: return self // ऴ୺ } } } Week.Friday == Week.Friday // true (Week.Monday ... .Friday).contains(.Wednesday) // true 'PSXBSE*OEFY5ZQF ྫ

Slide 18

Slide 18 text

Ұ࿈ͷۭؒͷதͷ཭ࢄ஋ Sunday Monday Tuesday … Saturday ͜ͷੑ࣭Λදݱ͢ΔͨΊͷཁ݅ l࣍ͷ஋Λࣔ͢z

Slide 19

Slide 19 text

enum Week { case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } extension Week: ForwardIndexType { // ͜ͷ৔߹ͷ enum ͸ Hashable ʹ҉໧తʹ४ڌ͠·͢ɻ // protocol Hashable : Equatable ͳͷͰ͢Ͱʹ Equatable ʹ४ڌࡁΈͰ͢ɻ func successor() -> Week { switch self { case .Sunday: return .Monday case .Monday: return .Tuesday case .Tuesday: return .Wednesday case .Wednesday: return .Thursday case .Thursday: return .Friday case .Friday: return .Saturday case .Saturday: return .Sunday // ࠷ॳʹ໭Δ } } } (Week.Saturday ... .Monday).contains(.Sunday) // true 'PSXBSE*OEFY5ZQF ྫ Sunday Monday Tuesday … Saturday

Slide 20

Slide 20 text

5...2 ͭ͡͸ɻɻ

Slide 21

Slide 21 text

let loopRange: Range = 5...2 ͭ͡͸ɻɻ ࣗ࡞ͷܕ

Slide 22

Slide 22 text

let loopRange: Range = LoopIndex(5)...LoopIndex(2) ͭ͡͸ɻɻ ࣗ࡞ͷܕ

Slide 23

Slide 23 text

let loopRange: Range = ͭ͡͸ɻɻ ࣗ࡞ͷܕ 5...2 extension LoopIndex : IntegerLiteralConvertible ॳظԽ࣌ʹ
 ੔਺ϦςϥϧΛड͚औΕΔ

Slide 24

Slide 24 text

Conforming types can be initialized with integer literals. QSPUPDPM*OUFHFS-JUFSBM$POWFSUJCMF

Slide 25

Slide 25 text

struct LoopIndex { let rawValue: Int init(_ rawValue: Int) { self.rawValue = rawValue } } // OK let loopIndex = LoopIndex(1) // ௨ৗ͸Ͱ͖ͳ͍ // error: cannot convert value of type 'Int' to specified type 'LoopIndex' let beforeConform: LoopIndex = 5 -PPQ*OEFY ࣗ࡞ͷܕ

Slide 26

Slide 26 text

struct LoopIndex { let rawValue: Int init(_ rawValue: Int) { self.rawValue = rawValue } } extension LoopIndex: IntegerLiteralConvertible { init(integerLiteral value: IntegerLiteralType) { self.init(value) } } let loopIndex: LoopIndex = 1 -PPQ*OEFY*OUFHFS-JUFSBM$POWFSUJCMF 0,

Slide 27

Slide 27 text

struct LoopIndex { let rawValue: Int init(_ rawValue: Int) { self.rawValue = rawValue } } extension LoopIndex: IntegerLiteralConvertible { init(integerLiteral value: IntegerLiteralType) { self.init(value) } } extension LoopIndex: ForwardIndexType { // ུ } let loopIndex: LoopIndex = 1 let loopRange : Range = 5...2 loopRange.contains(1) // true -PPQ*OEFY*OUFHFS-JUFSBM$POWFSUJCMF 0,

Slide 28

Slide 28 text

let loopRange: Range = 5...2

Slide 29

Slide 29 text

5...2 ஫τϦοΩʔͳ͜ͱΛ͢Δͱ͖͸৻ॏʹʂʂ

Slide 30

Slide 30 text

ͪΐͬͱৼΓฦͬͯΈ·͠ΐ͏

Slide 31

Slide 31 text

QSPUPDPM'PSXBSE*OEFY5ZQF QSPUPDPM*OUFHFS-JUFSBM$POWFSUJCMF

Slide 32

Slide 32 text

enum Week { case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } 8FFL Sunday Monday Tuesday … Saturday 8FFL

Slide 33

Slide 33 text

enum Week { case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } extension Week: ForwardIndexType { // ͜ͷ৔߹ͷ enum ͸ Hashable ʹ҉໧తʹ४ڌ͠·͢ɻ // protocol Hashable : Equatable ͳͷͰ͢Ͱʹ Equatable ʹ४ڌࡁΈͰ͢ɻ func successor() -> Week { switch self { case .Sunday: return .Monday case .Monday: return .Tuesday case .Tuesday: return .Wednesday case .Wednesday: return .Thursday case .Thursday: return .Friday case .Friday: return .Saturday case .Saturday: return self // ऴ୺ } } } 8FFL'PSXBSE*OEFY5ZQF Sunday Monday Tuesday … Saturday 8FFL

Slide 34

Slide 34 text

struct LoopIndex { let rawValue: Int init(_ rawValue: Int) { self.rawValue = rawValue } } // OK let loopIndex = LoopIndex(1) // ௨ৗ͸Ͱ͖ͳ͍ // error: cannot convert value of type 'Int' to specified type 'LoopIndex' let beforeConform: LoopIndex = 5 -PPQ*OEFY ࣗ࡞ͷܕ

Slide 35

Slide 35 text

struct LoopIndex { let rawValue: Int init(_ rawValue: Int) { self.rawValue = rawValue } } extension LoopIndex: IntegerLiteralConvertible { init(integerLiteral value: IntegerLiteralType) { self.init(value) } } let loopIndex: LoopIndex = 1 -PPQ*OEFY*OUFHFS-JUFSBM$POWFSUJCMF -PPQ*OEFY 1

Slide 36

Slide 36 text

struct LoopIndex { let rawValue: Int init(_ rawValue: Int) { self.rawValue = rawValue } } extension LoopIndex: IntegerLiteralConvertible { init(integerLiteral value: IntegerLiteralType) { self.init(value) } } let loopIndex: LoopIndex = 1 -PPQ*OEFY*OUFHFS-JUFSBM$POWFSUJCMF -PPQ*OEFY 1

Slide 37

Slide 37 text

⭕࢖͑Δػೳ͕૿͑Δ

Slide 38

Slide 38 text

΋ͬͱخ͍͜͠ͱ

Slide 39

Slide 39 text

ϓϩτίϧʹ४ڌ͢Δ͜ͱͰ
 ܕ͕ද֓͢೦ΛΑΓ໌֬ʹදݱͰ͖Δʂ

Slide 40

Slide 40 text

enum Week { case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } extension Week: ForwardIndexType { // ͜ͷ৔߹ͷ enum ͸ Hashable ʹ҉໧తʹ४ڌ͠·͢ɻ // protocol Hashable : Equatable ͳͷͰ͢Ͱʹ Equatable ʹ४ڌࡁΈͰ͢ɻ func successor() -> Week { switch self { case .Sunday: return .Monday case .Monday: return .Tuesday case .Tuesday: return .Wednesday case .Wednesday: return .Thursday case .Thursday: return .Friday case .Friday: return .Saturday case .Saturday: return self // ऴ୺ } } } 8FFL'PSXBSE*OEFY5ZQF Sunday Monday Tuesday … Saturday 8FFL

Slide 41

Slide 41 text

struct LoopIndex { let rawValue: Int init(_ rawValue: Int) { self.rawValue = rawValue } } extension LoopIndex: IntegerLiteralConvertible { init(integerLiteral value: IntegerLiteralType) { self.init(value) } } let loopIndex: LoopIndex = 1 -PPQ*OEFY*OUFHFS-JUFSBM$POWFSUJCMF -PPQ*OEFY 1

Slide 42

Slide 42 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

Slide 43

Slide 43 text

ࢀߟ w 4XJGU4UBOEBSE-JCSBSZ3FGFSFODF
 IUUQTEFWFMPQFSBQQMFDPNMJCSBSZJPT EPDVNFOUBUJPO(FOFSBM3FGFSFODF 4XJGU4UBOEBSE-JCSBSZ3FGFSFODF w 4XJGU%PDPSH
 IUUQTXJGUEPDPSHWQSPUPDPM'PSXBSE*OEFY5ZQF w Ϧςϥϧͱܕͷ࿩
 IUUQXXXTMJEFTIBSFOFUUPNPIJSPLVNBHBJ TXJGU