14. protocol CollectionType {
typealias Element
typealias Index : ForwardIndexType
subscript(index:Index) -> Element { get }
var startIndex:Index { get }
var endIndex:Index { get }
}
プロトコル
プロトコルを定義する
これらの機能が使えることを保証
Swift 1.2
38. protocol CollectionType {
typealias Element
typealias Index : ForwardIndexType
subscript(index:Index) -> Element { get }
var startIndex:Index { get }
var endIndex:Index { get }
}
Protocol Extension
Swift 2.0
たとえば、こんなプロトコルがあったとき
39. extension CollectionType {
var count:Index.Distance {
return distance(self.startIndex, self.endIndex)
}
var indices:Range<Index> {
return self.startIndex ..< self.endIndex
}
}
Protocol Extension
Swift 2.0
プロトコル拡張で振る舞いから機能を実装
40. struct Month : CollectionType {
subscript(index:Int) -> Day {
return self.days[index - 1]
}
var startIndex:Int {
return 1
}
var endIndex:Int {
return self.days.count + 1
}
}
Protocol Extension
Swift 2.0
型では最低限の機能だけを実装すれば
41. let month = Month()
month.count
month.indices
Protocol Extension
Swift 2.0
プロトコル拡張で実装した機能も使える
43. protocol CollectionType {
typealias Element
typealias Index : ForwardIndexType
subscript(index:Index) -> Element { get }
var startIndex:Index { get }
var endIndex:Index { get }
}
Swift 1.2
// 機能は大域関数で提供
func count<T:CollectionType>(x:T) -> T.Index.Distance {
return distance(x.startIndex, x.endIndex)
}
func indices<C:CollectionType>(x:C) -> Range<C.Index> {
return x.startIndex ..< x.endIndex
}
// 振る舞いをプロトコルで規定
44. protocol CollectionType {
typealias Element
typealias Index : ForwardIndexType
subscript(index:Index) -> Element { get }
var startIndex:Index { get }
var endIndex:Index { get }
}
extension CollectionType {
var count:Index.Distance {
return distance(self.startIndex, self.endIndex)
}
var indices:Range<Index> {
return self.startIndex ..< self.endIndex
}
}
// 振る舞いも機能もプロトコル内に集約
Swift 2.0