Slide 1

Slide 1 text

Swift ͷੈք؍ͱ
 ͦͷடং 2016/3/29 ezura

Slide 2

Slide 2 text

ಥવͰ͕͢

Slide 3

Slide 3 text

Swift ͷͲ͕͜޷͖Ͱ͔͢ʁ

Slide 4

Slide 4 text

ࢲ͸ɺۭؾͷΑ͏ʹ Protocol ͕ͨͪଘࡏ͠ɺ
 ಇ͖͔͚͍ͯΔ༷ࢠ͕޷͖Ͱ͢ɻ

Slide 5

Slide 5 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 6

Slide 6 text

ͦΜͳɺۭؾͷΑ͏ʹࡏΓɺSwift ͷੈքΛ
 ࢧ͍͑ͯΔଘࡏ

Slide 7

Slide 7 text

ඪ४ϥΠϒϥϦͷੈքΛ೷͍ͯΈ·͠ΐ͏

Slide 8

Slide 8 text

Swift ͷੈք؍ͱ
 ͦͷடং ඪ४ϥΠϒϥϦ͕
 ૊Έ্͛Δ

Slide 9

Slide 9 text

୭ʁ • ៸໘༑߳ (ezura) • τϥΠϑΥʔτͰಇ͘ iOS ΤϯδχΞ • ݴޠͷઃܭ֓೦ͱ͔ߟ͑Δͷ͕޷͖ • twitter: @eduraaa

Slide 10

Slide 10 text

ࠓճɺ͓࿩͢͠Δ͜ͱ

Slide 11

Slide 11 text

ඪ४ϥΠϒϥϦͷ৺Λཧղ͢Δ
 ಋೖฤ Swift ͷίΞ

Slide 12

Slide 12 text

໨ඪ
 ඪ४ϥΠϒϥϦΛಡΈղ͖΍͘͢ͳΔ͜ͱ

Slide 13

Slide 13 text

ࠓճ͸ɺಛʹϓϩτίϧয఺Λ౰ͯͯΈ·͠ΐ͏

Slide 14

Slide 14 text

• ࣗ෼ͰϓϩτίϧΛઃܭ͢Δͱ͖ͷࢀߟ • Ͱ͖Δ͜ͱͷ෯͕޿͕Δ ඪ४ϥΠϒϥϦͷϓϩτίϧΛཧղ͓ͯ͘͠ͱ…

Slide 15

Slide 15 text

let elements = [2, 5, 1]
 elements.sort() // [1, 2, 5] ྫ͑͹ɾɾɾ

Slide 16

Slide 16 text

let elements: [CupSize] = [.Short, .Grande, .Short]
 
 // error: missing argument for parameter #1 in call elements.sort() ྫ͑͹ɾɾɾ

Slide 17

Slide 17 text

enum CupSize: Int { case Short = 0, Tall, Grande, Venti } extension CupSize : Comparable {}
 // ུ let cupSizes: [CupSize] = [.Short, .Grande, .Short] cupSizes.sort() // [Short, Short, Grande] ഑ྻͷཁૉ͕ Comparable ʹ४ڌ͍ͯ͠Δͱɺ
 ͜ͷॻ͖ํͰ sort ͕࢖͑ΔΑ͏ʹͳΔ ྫ͑͹ɾɾɾ

Slide 18

Slide 18 text

ɹͰ͸ɺຊ୊

Slide 19

Slide 19 text

• ϓϩτίϧΛݟ͚ͭͯΈΔ • ݟ͚ͭͨϓϩτίϧΛ؍࡯ͯ͠ΈΔ • ඪ४ϥΠϒϥϦͷϓϩτίϧͨͪͱͷ஥ྑ͘ͳΓํ ൃදͷྲྀΕ

Slide 20

Slide 20 text

• ϓϩτίϧΛݟ͚ͭͯΈΔ • ݟ͚ͭͨϓϩτίϧΛ؍࡯ͯ͠ΈΔ • ඪ४ϥΠϒϥϦͷϓϩτίϧͨͪͱͷ஥ྑ͘ͳΓํ

Slide 21

Slide 21 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 22

Slide 22 text

for element in [1, 2, 3] { /* do something */ } [1, 2, 3].forEach { _ in /* do something */ }
 
 [1, 2, 3].sort()

Slide 23

Slide 23 text

SequenceType for element in [1, 2, 3] { /* do something */ } [1, 2, 3].forEach { _ in /* do something */ }
 
 [1, 2, 3].sort() ࣭໰: Ͳ͏ͯ͠഑ྻ͸͜ΕΒͷૢ࡞͕Ͱ͖Δͷʁ Ұͭͷճ౴
 ഑ྻ͸ཁૉΛҰͭҰͭऔΓग़ͤΔ͔Β

Slide 24

Slide 24 text

let array: Array = [1, 2, 3] struct Array : CollectionType
 SequenceType Λܧঝ for element in array { /* do something */ } array.forEach { _ in /* do something */ }
 
 array.sort(<)

Slide 25

Slide 25 text

ඪ४ϥΠϒϥϦͷϓϩτίϧͷҰͭ
 SequenceType

Slide 26

Slide 26 text

• ϓϩτίϧΛݟ͚ͭͯΈΔ • ݟ͚ͭͨϓϩτίϧΛ؍࡯ͯ͠ΈΔ • ඪ४ϥΠϒϥϦͷϓϩτίϧͨͪͱͷ஥ྑ͘ͳΓํ

Slide 27

Slide 27 text

protocol SequenceType { associatedtype Generator : GeneratorType public func generate() -> Self.Generator
 public func map … ུ public func forEach … ུ
 // ུ } extension SequenceType where Self.Generator.Element : Comparable { public func sort() -> [Self.Generator.Element] } SequenceType required

Slide 28

Slide 28 text

extension MySequenceTypeStruct: SequenceType { func generate() -> AnyGenerator { var iteration = 0 return AnyGenerator { defer { iteration += 1 } guard iteration < 3 else { return nil } return iteration } } } let sequenceTypeStruct = MySequenceTypeStruct()
 
 for element in sequenceTypeStruct { print(element) } sequenceTypeStruct.sort() SequenceType
 ʹ४ڌ SequenceType
 ͷೳྗΛߦ࢖

Slide 29

Slide 29 text

SequenceType
 
 ஋Λॱ൪ʹऔΕΔ
 ⁶
 Ұ࿈ͷ஋Λදݱ͢Δ΋ͷ Value Value Value … …

Slide 30

Slide 30 text

protocol SequenceType { associatedtype Generator : GeneratorType public func generate() -> Self.Generator
 public func map … ུ public func forEach … ུ } extension SequenceType where Self.Generator.Element : Comparable { public func sort() -> [Self.Generator.Element] } SequenceType
 Ұ࿈ͷ஋Λදݱ ஋ΛҰͭҰͭॱ൪ʹ
 औΓग़ͨ͢ΊͷػߏΛ࡞੒͢Δ
 ϝιου “Ұ࿈ͷ஋Λදݱ͢Δ” 
 ͜ͱʹΑͬͯͰ͖Δೳྗ

Slide 31

Slide 31 text

for element in [1, 2, 3] { /* do something */ } [1, 2, 3].forEach { _ in /* do something */ }
 
 [1, 2, 3].sort() ࣭໰: Ͳ͏ͯ͠഑ྻ͸͜ΕΒͷૢ࡞͕Ͱ͖Δͷʁ

Slide 32

Slide 32 text

˛ ഑ྻ͔ͩΒ for … in ΍ forEach ͕࢖͑Δ
 ⭕️ SequenceType ʹ४ڌ͍ͯ͠Δ͔Β for … in ΍ 
 forEach ͕࢖͑Δ ⭕ ഑ྻ͕ʮҰ࿈ͷ஋Λදݱ͢Δʯ΋ͷ͔ͩΒɺ
 ͦͷੑ࣭͕࢖͑Δ ݫີʹ͸ Array ͸ SequenceType Λܧঝͨ͠
 CollectionType ʹ४ڌ͍ͯ͠·͢

Slide 33

Slide 33 text

for element in [1, 2, 3] { /* do something */ } [1, 2, 3].forEach { _ in /* do something */ }
 
 [1, 2, 3].sort() SequenceType ࣭໰: Ͳ͏ͯ͠഑ྻ͸͜ΕΒͷૢ࡞͕Ͱ͖Δͷʁ

Slide 34

Slide 34 text

for element in [1, 2, 3] { /* do something */ } [1, 2, 3].forEach { _ in /* do something */ }
 
 [1, 2, 3].sort()
 
 [1, 2, 3].count ❌ SequenceType
 ⭕️ CollectionType ࣭໰: Ͳ͏ͯ͠഑ྻ͸͜ΕΒͷૢ࡞͕Ͱ͖Δͷʁ

Slide 35

Slide 35 text

ඪ४ϥΠϒϥϦͷϓϩτίϧ͸
 υΩϡϝϯτ্Ͱ֬ೝͰ͖Δ͚ͩͰ΋ɺ
 56 ݸ

Slide 36

Slide 36 text

AbsoluteValuable AnyCollectionType AnyObject ArrayLiteralConvertible BidirectionalIndexType BitwiseOperationsType BooleanLiteralConvertible BooleanType CVarArgType CollectionType Comparable CustomDebugStringConverti ble CustomLeafReflectable CustomPlaygroundQuickLoo kable CustomReflectable CustomStringConvertible DictionaryLiteralConvertible Equatable ErrorType ExtendedGraphemeClusterL iteralConvertible FloatLiteralConvertible FloatingPointType ForwardIndexType GeneratorType Hashable Indexable IntegerArithmeticType IntegerLiteralConvertible IntegerType IntervalType LazyCollectionType LazySequenceType MirrorPathType MutableCollectionType MutableIndexable MutableSliceable NilLiteralConvertible OptionSetType OutputStreamType RandomAccessIndexType RangeReplaceableCollectio nType RawRepresentable ReverseIndexType SequenceType SetAlgebraType SignedIntegerType SignedNumberType Streamable Strideable StringInterpolationConvertibl e StringLiteralConvertible UnicodeCodecType UnicodeScalarLiteralConvert ible UnsignedIntegerType _ArrayBufferType _ArrayType _CVarArgAlignedType _CVarArgPassedAsDouble _CollectionWrapperType _DestructorSafeContainer _DisallowMixedSignArithmeti c _Incrementable _IntegerArithmeticType _IntegerType _MirrorType _NSArrayCoreType _NSCopyingType _NSDictionaryCoreType _NSDictionaryType _NSEnumeratorType _NSFastEnumerationType _NSSetCoreType _NSSetType _NSStringCoreType _ObjectiveCBridgeable _PointerType _RandomAccessAmbiguity _Reflectable _ReverseCollectionType _SequenceWrapperType _ShadowProtocol _SignedIntegerType _SinkType _StringElementType Swift Standard Library Reference ʹهࡌ͞Ε͍ͯͳ͍΋ͷؚΉ

Slide 37

Slide 37 text

SequenceType ͸ණࢁͷҰ֯ʂ

Slide 38

Slide 38 text

• ϓϩτίϧΛݟ͚ͭͯΈΔ • ݟ͚ͭͨϓϩτίϧΛ؍࡯ͯ͠ΈΔ • ඪ४ϥΠϒϥϦͷϓϩτίϧͨͪͱͷ஥ྑ͘ͳΓํ

Slide 39

Slide 39 text

• ܧঝؔ܎Ͱ਌ͷ΋ͷ͔ΒݟΔ (্Ґͷ֓೦͔ΒݟΔ) • ίʔυ΍ϦϑΝϨϯεΛݟͯɺϓϩτίϧ͕ԿΛද ݱ͍ͨ͠ͷ͔ߟ͑ͯΈΔ
 Swift Standard Library Reference, SwiftDoc.org • ४ڌ͍ͯ͠ΔܕΛ࡞ͬͯΈΔ ݸਓతʹ࣮ફ͍ͯ͠Δ͜ͱ

Slide 40

Slide 40 text

ϓϩτίϧ͕ԿΛදݱ͍ͨ͠ͷ͔ߟ͑ͯΈΔ

Slide 41

Slide 41 text

Objective-C Ͱ΋ɺNSFastEnumeration ʹ४ڌ͢Ε͹ 
 for … in ͕࢖͑Δ @protocol NSFastEnumeration - (NSUInteger)countByEnumeratingWithState: (NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len; @end

Slide 42

Slide 42 text

• for … in ͸ SequenceType ͷҰػೳ • ͦͷੑ࣭ɾ֓೦͔ͩΒͦ͜ͷೳྗΛϓϩτίϧଆͰ ఆٛ
 (ʮͦͷੑ࣭ɾ֓೦ͳΒ͜͏ಇ͘ΑͶʯ͕هड़͞Ε͍ͯΔ)
 forEach, sort, map, … Swift ͱ Objective-C ͰҟͳΔͱ͜Ζ

Slide 43

Slide 43 text

• ಛఆͷλεΫɺػೳΛຬͨͨ͢Ίʹඞཁͳཁ݅Λ
 એݴ • ֦ு͢Δ͜ͱʹΑͬͯඞཁཁ݅ͷҰ෦Λຬͨͨ͠Γɺ ४ڌͨ͠ܕ͕࢖͑ΔػೳΛఏڙͰ͖Δ ࢀর: The Swift Programming Language (Swift 2.2) The Swift Programming Language ΑΓ Swift ʹ͓͚Δ Protocol ͱ͸

Slide 44

Slide 44 text

• ಛఆͷλεΫɺػೳΛຬͨͨ͢Ίʹඞཁͳཁ݅Λ
 એݴ • ֦ு͢Δ͜ͱʹΑͬͯඞཁཁ݅ͷҰ෦Λຬͨͨ͠Γɺ ४ڌͨ͠ܕ͕࢖͑ΔػೳΛఏڙͰ͖Δ ࢀর: The Swift Programming Language (Swift 2.2) The Swift Programming Language ΑΓ ඪ४ϥΠϒϥϦͷϓϩτίϧͷઃܭ (஫: ࢲݟ) ͦͷੑ࣭ɾ ֓೦ͨΒ͠ΊΔ΋ͷͷએݴ ͦͷੑ࣭ɾ֓೦͔ͩΒͦ͜ͷೳྗ ͦͷੑ࣭ɾ֓೦ͨΒ͠ΊΔͨ Ίͷಛੑ

Slide 45

Slide 45 text

ͦΜͳ؍఺ͰݟͯΔͱ…

Slide 46

Slide 46 text

protocol SequenceType { associatedtype Generator : GeneratorType public func generate() -> Self.Generator
 public func map … ུ public func forEach … ུ } extension SequenceType where Self.Generator.Element : Comparable { public func sort() -> [Self.Generator.Element] } SequenceType
 Ұ࿈ͷ஋Λදݱ ֓೦ɾੑ࣭Λදݱ͢ΔͨΊཁ݅
 ϝιουɾؔ਺ɾϓϩύςΟͳͲ ͦͷ֓೦ɾੑ࣭Ͱ͋Δ͕
 Ώ͑ʹ࣋ͭೳྗ ͦͷ֓೦ɾੑ࣭Ͱ͋Δ͕
 Ώ͑ʹ࣋ͭೳྗ

Slide 47

Slide 47 text

Ұ͚ͭͩɺ࣮ફ

Slide 48

Slide 48 text

• ܧঝؔ܎Ͱ਌ͷ΋ͷ͔ΒݟΔ (্Ґͷ֓೦͔ΒݟΔ) • ίʔυ΍ϦϑΝϨϯεΛݟͯɺϓϩτίϧ͕ԿΛද ݱ͍ͨ͠ͷ͔ߟ͑ͯΈΔ
 Swift Standard Library Reference, SwiftDoc.org • ४ڌ͍ͯ͠ΔܕΛ࡞ͬͯΈΔ ݸਓతʹ࣮ફ͍ͯ͠Δ͜ͱ

Slide 49

Slide 49 text

for element in [1, 2, 3] { /* do something */ } [1, 2, 3].forEach { _ in /* do something */ }
 
 [1, 2, 3].sort()
 
 [1, 2, 3].count SequenceType ❌ SequenceType
 ⭕️ CollectionType

Slide 50

Slide 50 text

CollectionType
 A multi-pass sequence with addressable positions. Կͱͳ͘Θ͔ΔΑ͏ͳɺΘ͔Βͳ͍Α͏ͳ…
 SequenceType ͱͲ͏ҧ͏ͷʁ

Slide 51

Slide 51 text

ܧঝؔ܎ΛΈͯΈΔ SwiftDoc.org ͔ΒҾ༻

Slide 52

Slide 52 text

SwiftDoc.org ͔ΒҾ༻ … … … … SequenceType
 Ұ࿈ͷ஋Λදݱ … … Indexable
 ఴࣈͰΞΫηεՄೳ 1 start end

Slide 53

Slide 53 text

SequenceType
 Ұ࿈ͷ஋Λදݱ͢Δ΋ͷ Value Value Value … … + Indexable
 ࠷ॳͱ࠷ޙ͕ܾ·͍ͬͯΔ
 ఴࣈͰΞΫηεՄೳ

Slide 54

Slide 54 text

SequenceType
 Ұ࿈ͷ஋Λදݱ͢Δ΋ͷ Value Value Value + Indexable
 ࠷ॳͱ࠷ޙ͕ܾ·͍ͬͯΔ
 ఴࣈͰΞΫηεՄೳ start end

Slide 55

Slide 55 text

public protocol CollectionType : Indexable, SequenceType { associatedtype Generator : GeneratorType = 
 IndexingGenerator public func generate() -> Self.Generator // ... public var count: Self.Index.Distance { get } public var first: Self.Generator.Element? { get } } // ... ֓೦ɾੑ࣭Λදݱ ֓೦ɾੑ࣭Λදݱ ͦͷੑ࣭ɾ֓೦
 ͔ͩΒͦ͜ͷೳྗ ্Ґ֓೦

Slide 56

Slide 56 text

CollectionType
 
 A multi-pass sequence with addressable positions. Value Value Value Value Value

Slide 57

Slide 57 text

• ܧঝؔ܎Ͱ਌ͷ΋ͷ͔ΒݟΔ (্Ґͷ֓೦͔ΒݟΔ) • ίʔυ΍ϦϑΝϨϯεΛݟͯɺϓϩτίϧ͕ԿΛද ݱ͍ͨ͠ͷ͔ߟ͑ͯΈΔ
 Swift Standard Library Reference, SwiftDoc.org • ४ڌ͍ͯ͠ΔܕΛ࡞ͬͯΈΔ ݸਓతʹ࣮ફ͍ͯ͠Δ͜ͱ

Slide 58

Slide 58 text

• ϓϩτίϧΛݟ͚ͭͯΈΔ • ݟ͚ͭͨϓϩτίϧΛ؍࡯ͯ͠ΈΔ • ඪ४ϥΠϒϥϦͷϓϩτίϧͨͪͱͷ஥ྑ͘ͳΓํ

Slide 59

Slide 59 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 60

Slide 60 text

enum CupSize: Int { case Short = 0, Tall, Grande, Venti } extension CupSize : Comparable {}
 // ུ let cupSizes: [CupSize] = [.Short, .Grande, .Short] cupSizes.sort() // [Short, Short, Grande] let numbers = [2, 5, 1]
 numbers.sort() // [1, 2, 5] Comparable

Slide 61

Slide 61 text

·ͱΊ • ඪ४ϥΠϒϥϦͷϓϩτίϧͷ࡞Δடংͷ্Ͱ༷ʑ ͳॲཧ͕ಈ͍͍ͯΔ • ϓϩτίϧ͕ԿΛදݱ͍ͨ͠ͷ͔ɺಡΈղ͍ͯΈΔ ͱָ͍͠

Slide 62

Slide 62 text

ϓϩτίϧɺδΣωϦοΫؔ਺͕ͨͪؔ܎͠߹͏༷ࢠ
 (͓౔࢈ʹ͠·͢ɻ༡ΜͰΈ͍ͯͩ͘͞ɻ) ೖΓ͖Βͳ͔ͬͨ΋ͷ
 https://github.com/ezura/SwiftPlayground/tree/ master/stdlib_sample.playground

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

ࢀߟ • The Swift Programming Language (Swift 2.2)
 Language Guide / Protocols
 https://developer.apple.com/library/ios/documentation/Swift/ Conceptual/Swift_Programming_Language/Protocols.html#// apple_ref/doc/uid/TP40014097-CH25-ID267 • Swift Standard Library Reference
 The Swift Standard Library
 https://developer.apple.com/library/ios/documentation/ General/Reference/SwiftStandardLibraryReference/#protocols • SwiftDoc.org
 http://swiftdoc.org/v2.2/protocol