swifter-tips / Public-Issues

Public issues for Swifter-tips book
103 stars 3 forks source link

Sequence章节实现的ReverseSequence有误 #21

Closed Fengjincheng closed 9 years ago

Fengjincheng commented 9 years ago

您在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)") }

onevcat commented 9 years ago

感谢提出,回头看看。

onevcat commented 9 years ago

Hello @Fengjincheng 感谢提出。

今天看了一下原来的代码,然后对比了下您的例子,可能是我书里说明的不够。原本打算实现的就是一个最简单的倒数例程,我会修改和增加一些目的性说明以避免误解。

谢谢。

Fengjincheng commented 9 years ago

是的,可能需要在例子中让index与element的类型不一样,就更好理解了。 谢谢分享 @onevcat