使いどころ
配列のように扱うクラスや構造体で for in
や map
などを使いたいとき
ポイント
SequenceTypeプロトコルに準拠するためにはgenerate()
を実装する必要がある。
generate()
の返り値 はAnyGenerator
を利用することで専用の構造体等を実装する必要が無くなる。
Swift3.0からはSequenceType
はSequence
に、AnyGenerator
はAnyIterator
にリネームされるなどゴソッと置き換わる模様
実装サンプル
Swift 2.2
struct Cowntdown {
let start: Int
}
extension Cowntdown : SequenceType {
func generate() -> AnyGenerator<Int?> {
var times = 0
return AnyGenerator {
let nextNumber = self.start - times
guard nextNumber > 0 else{
return nil
}
times += 1
return nextNumber
}
}
}
let threeTwoOne = Cowntdown(start: 3)
for count in threeTwoOne {
print("\(count!)...")
}
Swift 3.0
struct Cowntdown {
let start: Int
}
extension Cowntdown : Sequence {
func makeIterator() -> AnyIterator<Int?> {
var times = 0
return AnyIterator {
let nextNumber = self.start - times
guard nextNumber > 0 else{
return nil
}
times += 1
return nextNumber
}
}
}
let threeTwoOne = Cowntdown(start: 3)
for count in threeTwoOne {
print("\(count!)...")
}