这个问题已经困扰我一段时间了。我不确定我是否遗漏了一些东西,但这不应该起作用吗?
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]
}
}
将对象参数转换为 A 对象数组时会发生错误。该错误表明“A”不是“T”的子类型
,显然情况并非如此。
这真的很烦人,因为我想要一个通用方法,可以以相同的方式处理多个类的对象数组。我首先尝试使用 switch 语句,不创建额外的协议(protocol)(如 IDIdentific),但这些方法都不起作用。
我很高兴收到任何建议!
最佳答案
如果您声明协议(protocol)需要变量 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]
}
关于iOS swift : Generic array cast to array of subclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172813/