Swift 中的通用委托

Generic delegate in Swift

我正在写一个小程序 class,它有助于自动获取分页数据。

我有以下代表:

protocol DataAPIDelegate: class {
  func fetchItemsForPage<T>(api: DataAPI<T>, page: Int, onFinish: ([T] -> ())
}

和存储委托的 DataAPI class:

class DataAPI<T> {
  weak var delegate: DataAPIDelegate? = nil

  //...
  //some other methods
}

然后,我想做的是编写一个视图控制器,它使用 DataAPI 并通过 DataAPIDelegate 与该对象通信:

class CarsViewController: DataAPIDelegate {
  var dataAPI = DataAPI<Car>

  // MARK :- DataAPIDelegate
  func fetchItemsForPage<T>(api: DataAPI<T>, page: Int, onFinish: ([T] -> ()) {
    let cars: [Car] = //some method for getting cars
    onFinish(cars)
  }
}

我在行中收到错误:Cannot invoke 'onFinish' with an argument list of type '([Car])'onFinish(cars)

我考虑了几个小时,但我不知道为什么它不起作用。有人遇到过这个问题吗?

泛型函数为 T 引用的多种类型提供单一模板实现,而您似乎想做的是专门为 Car 提供 fetchItemsForPage 方法的实现类型。

的工作方式是:

protocol DataAPIDelegate: class {
    func fetchItemsForPage<T>(api: DataAPI<T>, page: Int, onFinish: ([T] -> ()))
}

class DataAPI<T> {
    weak var delegate: DataAPIDelegate? = nil

    //...
    //some other methods
}

struct Car { }

class CarsViewController: DataAPIDelegate {
    var dataAPI = DataAPI<Car>()

    // MARK :- DataAPIDelegate
    func fetchItemsForPage<T>(api: DataAPI<T>, page: Int, onFinish: ([T] -> ())) {
        let items: [T] = [T]()
        onFinish(items)
    }
}

...而您要做的是:

struct Bike { }

class BikesViewController: DataAPIDelegate {
    var dataAPI = DataAPI<Bike>()

    // MARK :- DataAPIDelegate
    func fetchItemsForPage<Bike>(api: DataAPI<Bike>, page: Int, onFinish: ([Bike] -> ())) {
        let items: [Bike] = [Bike]()
        onFinish(items)
    }
}

... 但在后面的代码片段中 Bike 不是类型而是占位符,其工作方式与使用 T.

相同

在 Swift 中不可能使用泛型委托,如果它们不仅仅是函数的话。因为函数(闭包)可以是通用的。请参阅我试图解决相同问题的要点:https://gist.github.com/artyom-razinov/fe8c2b7611a0ba3bd2a3