iOS Swift:将泛型数组转换为子类数组
问题描述:
这个一直在窃听我一段时间。我不确定我是否错过了一些东西,但是不应该这样做?iOS Swift:将泛型数组转换为子类数组
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' is not a subtype of 'T'
,显然不是这种情况。
这真的很烦人,因为我想有一个通用的方法可以同样的方式处理多个类的对象数组。我首先尝试使用switch-statements创建一个额外的协议,如IDIdentifiable,但是这些方法都没有奏效。
我很高兴为您提供任何建议!
答
如果您声明协议要求变量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]
}
这和我这里的问题不一样吗? http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself – matt
停止说“没有工作”。这没有意义。你已经通过解释这个问题是一个编译错误来解决了这个问题。那就是我所追求的。 – matt
确实非常相似。尽管如此。 – Yeehaw