您在ReverseGenerator中定义的typealias Element = Int,是不对的。导致for in得到的仅是递减的下标值,而不是Sequence中的每一个元素。
而应该定义为typealias Element = T,可在playground中试试,例程如下:
struct ReverseSequence: GeneratorType, SequenceType {
// GeneratorType
typealias Element = T
var index: Int
var array: [Element]
您在ReverseGenerator中定义的typealias Element = Int,是不对的。导致for in得到的仅是递减的下标值,而不是Sequence中的每一个元素。 而应该定义为typealias Element = T,可在playground中试试,例程如下: struct ReverseSequence: GeneratorType, SequenceType {
// GeneratorType
typealias Element = T
var index: Int
var array: [Element]
init(array: [Element]) { self.array = array self.index = array.count - 1 }
mutating func next() -> Element? { return index >= 0 ? array[index--] : nil }
// SequenceType typealias Generator = ReverseSequence
func generate() -> Generator { return self } }
let arr = [100, 200, 300, 400, 500] let rvs_arr = ReverseSequence(array: [100, 200, 300, 400, 500]) print("rvs_arr:") for e in rvs_arr { print(" (e)") }
let str_arr = map(rvs_arr, {String($0+50)}) print("\nstr_arr:") for e in str_arr { print(" (e)") }
let flt_arr = filter(rvs_arr, {$0 > 100 && $0 < 500}) print("\nflt_arr:") for e in flt_arr { print(" (e)") }
let rst = reduce(rvs_arr, 8, {$0 + $1}) print("\nreduce: rst=(rst)")
let rvs_str_arr = ReverseSequence(array: str_arr) print("\nrvs_str_arr:") for e in rvs_str_arr { print(" (e)") }