阻止协议

时间:2017-06-16 17:51:22

标签: swift3 swift-protocols

以下是我在此处学习的示例代码(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”作为函数参数,错误仍然存​​在。 如果有人可以提供一些提示,我将不胜感激。感谢。

1 个答案:

答案 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
        }
    }
}