这个一直困扰我一段时间。我不确定我是否遗漏了某些东西,但不应该这样做吗?
protocol IDIdentifiable { }
class A : IDIdentifiable {
let id : Int
init(id: Int) { self.id = id }
}
class B : IDIdentifiable {
let id : Int
init(id: Int) { self.id = id }
}
func findObjectById<T: IDIdentifiable>(objects: [T], id: Int) -> T {
if let casted = objects as? [A] {
return casted.filter{ $0.id == id }[0]
}
}
将objects参数强制转换为A对象数组时会发生错误。错误显示'A' is not a subtype of 'T'
,显然情况并非如此。
它真的很烦人,因为我希望有一个通用的方法,可以用同样的方式处理多个类的对象数组。我首先尝试使用switch-statements创建IDIdentifiable之类的额外协议,但这些方法都不起作用。
我对任何建议感到高兴!
答案 0 :(得分:0)
如果声明协议需要变量id
,则不需要在泛型方法中强制转换类型。
protocol IDIdentifiable {
var id : Int { get set }
}
class A : IDIdentifiable {
var id : Int
init(id: Int) { self.id = id }
}
class B : IDIdentifiable {
var id : Int
init(id: Int) { self.id = id }
}
func findObjectById<T: IDIdentifiable>(objects: [T], id: Int) -> T {
return objects.filter{ $0.id == id }[0]
}