以下是我在此处学习的示例代码(http://blog.krzyzanowskim.com/2015/06/26/paging/):
protocol AsyncGeneratorType {
associatedtype Element
associatedtype Fetch
func next(_ fetchNextBatch: Fetch, _ onFinish: ((Element) -> Void)?)
}
class PagingGenerator<T>: AsyncGeneratorType {
typealias Element = Array<T>
typealias Fetch = (_ offset: Int, _ limit: Int, _ completion: (_ result:
Element) -> Void) -> Void
var offset:Int
let limit: Int
init(startOffset: Int = 0, limit: Int = 25) {
self.offset = startOffset
self.limit = limit
}
func next(_ fetchNextBatch: Fetch, _ onFinish: ((Element) -> Void)? = nil) {
fetchNextBatch(offset, limit) { [unowned self] (items) in
onFinish?(items)
self.offset += items.count
}
}
}
编译器(xcode 8.3.2)给了我错误:
“类型'PagingGenerator'不符合协议 'AsyncGeneratorType'“
编译器提示:
协议要求函数'next',类型为'((Int,Int,(Array) - &gt; 无效) - &gt; Void,((Array) - &gt; Void)?) - &gt; ()';你想添加一个 短截线?
候选人具有非匹配类型'((Int,Int,(Array) - &gt; Void) - &GT; Void,((PagingGenerator.Element) - &gt; Void)?) - &gt; ()'
基本上,这是一个paginator类。 “元素”表示页面中的内容,“获取”表示检索元素的块
我试过没有使用泛型。只要我使用“Fetch”作为函数参数,错误仍然存在。 如果有人可以提供一些提示,我将不胜感激。感谢。
答案 0 :(得分:1)
只需删除类型别名,它应该编译
protocol AsyncGeneratorType {
associatedtype Element
associatedtype Fetch
func next(_ fetchNextBatch: Fetch, _ onFinish: ((Element) -> Void)?)
}
class PagingGenerator<T>: AsyncGeneratorType {
var offset:Int
let limit: Int
init(startOffset: Int = 0, limit: Int = 25) {
self.offset = startOffset
self.limit = limit
}
func next(_ fetchNextBatch: (_ offset: Int, _ limit: Int, _ completion: (_ result:
Array<T>) -> Void) -> Void, _ onFinish: ((Array<T>) -> Void)? = nil) {
fetchNextBatch(offset, limit) { [unowned self] (items) in
onFinish?(items)
self.offset += items.count
}
}
}