我试图创建两个相互依赖的对象,它们必须有一个方法来直接向下投射另一个对象的具体类。像这样的:
protocol aProt
{
var bVar:bProt! { get set }
}
protocol bProt
{
var aVar:aProt! { get set }
}
class a: aProt
{
var bVar: bProt!
func bConcrete() -> b {
return bVar as! b
}
}
class b: bProt
{
var aVar: aProt!
func aConcrete() -> a {
return aVar as! a
}
现在,问题是我希望这个行为(
func aConcrete(),func bConcrete()
)被a和b的子类继承,然后我认为最好的方法是使用泛型,但是。。。这是不可能的。甲级:围裙
{
巴尔:布鲁特!
函数bConcrete()->T{
返回bVar as!T型
}
}
class b: bProt
{
var aVar: aProt!
func aConcrete<T>() -> T {
return aVar as! T
}
你可以这样做,但当你不得不使用它时,你必须向下转换变量,因此没有办法以干净的方式来做:
let aObject = a()
let bSubclassObject = a.bConcrete() // The compiler complains it cannot infer the class of T
let bSubclassObject = a.bConcrete() as! bSubclass // this works, but this is exactly which I wanted to avoid... :(
最佳答案
定义泛型函数并将where添加到T:
protocol aProt {
var bVar: bProt! { get set }
}
protocol bProt {
var aVar:aProt! { get set }
}
class a: aProt {
var bVar: bProt!
func bConcrete<T: b>(_ type: T.Type) -> T? {
return bVar as? T
}
}
class b: bProt {
var aVar: aProt!
func aConcrete<T: a>(_ type: T.Type) -> T? {
return aVar as? T
}
}
class a1: a { }
class b1: b {
var fullName: String = "new object"
}
let aObj = a()
aObj.bVar = b1()
let bObj = aObj.bConcrete(b1.self)
bObj?.fullName
根据您的要求,调用bConcrete(b1.self)可能仍然不够好,但至少需要知道您希望返回的数据类型。
关于swift - swift 将3个字幕转换为动态类(class),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41377487/