swift 3 向下转换为动态 class
swift 3 downcast to dynamic class
我正在尝试创建几个相互依赖的对象,它们必须有一种方法可以直接向下转换另一个对象的具体 class。像这样:
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 的子 class 继承。然后我认为这样做的完美方法是使用泛型,但是......没有办法做到这一点。
class一个:aProt
{
var bVar: 保护!
func bConcrete() -> T {
return bVar 作为!吨
}
}
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) 可能仍然不够好,但至少您需要知道您希望 return.
我正在尝试创建几个相互依赖的对象,它们必须有一种方法可以直接向下转换另一个对象的具体 class。像这样:
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 的子 class 继承。然后我认为这样做的完美方法是使用泛型,但是......没有办法做到这一点。
class一个:aProt { var bVar: 保护! func bConcrete() -> T { return bVar 作为!吨 } }
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) 可能仍然不够好,但至少您需要知道您希望 return.