LazySequenceProtocolに準拠した拡張を実装する方法を理解しようとしています。LazySequenceProtocolの例が動作しない
だから私は以下のようにApple's API referenceからのサンプルコードを追っ:
struct LazyScanIterator<Base : IteratorProtocol, ResultElement>
: IteratorProtocol {
mutating func next() -> ResultElement? {
return nextElement.map { result in
nextElement = base.next().map { nextPartialResult(result, $0) }
return result
}
}
private var nextElement: ResultElement? // The next result of next().
private var base: Base // The underlying iterator.
private let nextPartialResult: (ResultElement, Base.Element) -> ResultElement
}
struct LazyScanSequence<Base: Sequence, ResultElement>
: LazySequenceProtocol // Chained operations on self are lazy, too
{
func makeIterator() -> LazyScanIterator<Base.Iterator, ResultElement> {
return LazyScanIterator(nextElement: initial, base: base.makeIterator(), nextPartialResult)
}
private let base: Base
private let initial: ResultElement
private let nextPartialResult: (ResultElement, Base.Iterator.Element) -> ResultElement
}
extension LazySequenceProtocol {
func scan<ResultElement>(
_ initial: ResultElement,
_ nextPartialResult: (ResultElement, Iterator.Element) -> ResultElement
) -> LazyScanSequence<Self, ResultElement> {
return LazyScanSequence(
initial: initial, base: self, nextPartialResult)
}
}
が、XCodeのは言う、
は、型の値を変換できません 'ResultElement' 予想引数の型に '_?'
オンラインreturn LazyScanIterator(nextElement: initial, base: base.makeIterator(), nextPartialResult)
。
私はエラーが離れて行くにしたかったが、何も働いていないので、私はちょうどLazyScanIterator
構造体にmutating func next()
部分からすべてのコードを削除し、ちょうどを返し、ResultElement
の代わりResultElement?
とnextElement
の種類を変更しました。
まあ、エラーは消えましたが、今は同じ行に新しいものがあります。
'(ResultElement、Base.Iterator.Element) - > ResultElement' 型の値を変換できません期待引数の型 '(_、_) - > _' にこれで間違っている何
サンプルコード?