【发布时间】:2015-07-04 10:22:54
【问题描述】:
我正在编写一个有助于自动获取分页数据的小类。
我有以下代表:
protocol DataAPIDelegate: class {
func fetchItemsForPage<T>(api: DataAPI<T>, page: Int, onFinish: ([T] -> ())
}
还有存储委托的DataAPI类:
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)。
我考虑了几个小时,但我不知道为什么它不起作用。有人遇到过这个问题吗?
【问题讨论】:
-
在您的
CarsViewController中将T替换为Car以修复编译错误。查看this 关于通用页面生成器的博文,... -
用
Car替换T后,我得到了错误:'Car' is not identical to 'Car'与获取汽车:let car: [Car] = ...一致。似乎 Swift 编译器将Car视为类型变量(因为fetchItemsForPage<Car>声明)和类型本身(因为分配给cars变量的数组),所以它无法匹配它。
标签: ios swift generics delegates