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
我正在写一个小程序 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