我有两个类ClassOne和ClassTwo。我想根据变量值初始化另一个,我想做类似的事情:
if(a == "0") {
let b = ClassOne();
}else{
let b = ClassTwo();
}
无需每次需要时都写它。就像是:
让b = MainClass()
根据具体情况调用ClassOne()
或ClassTwo()
,a是全局变量。
答案 0 :(得分:3)
为了使其工作,两种类型应该通过扩展公共基类或通过实现相同的协议来关联。此外,对b
的后续操作仅限于这两个类的共同点。
如果您对此限制没有问题,可以这样做:
protocol CommonProtocol {
func foo() -> Double
var bar : Int { get }
}
class ClassOne : CommonProtocol {
...
}
class ClassTwo : CommonProtocol {
...
}
func MainClass() -> CommonProtocol {
if(a == "0") {
return ClassOne()
} else {
return ClassTwo()
}
}
...
let b = MainClass()
b.foo()
print(b.bar)
答案 1 :(得分:1)
你可以做到,但没有进一步的努力它就没有用。请考虑以下事项:
class ClassOne {}
class ClassTwo {}
现在我们继续将变量初始化为其中一个类的实例。为此,我们必须将变量键入AnyObject:
var which : Bool { return true /* or false */}
let obj : AnyObject
switch which {
case true:
obj = ClassOne()
case false:
obj = ClassTwo()
}
您现在拥有obj
作为ClassOne实例或ClassTwo实例。但这是一个问题。你不知道是哪个。 AnyObject输入保留真正的底层类型(多态),但它也隐藏类型。每次使用obj
时,您都必须测试,无论是ClassOne还是ClassTwo, 将其转换为该类型才能使用它。< / p>
if obj is ClassOne {
(obj as! ClassOne).doSomethingClassOneKnowsHowToDo()
}
问题是:痛苦值得获得吗?我建议你首先想做这件事的愿望可能是一个糟糕的气味,你应该修改你想要的建筑。严格的静态类型是Swift的重点;你错了想扔掉它。
答案 2 :(得分:0)
您可以使用三元运算符快速执行此操作,但每次都需要执行此操作:
let b = (a == 0) ? ClassOne() : ClassTwo() //If a==0 let b = ClassOne if not let b= ClassTwo.
答案 3 :(得分:0)
@dasblinkenlight解决方案很棒,但您也可以这样做
protocol MyProto {
var x: Int { get }
}
class A: MyProto {
var x = 10
var y = 10
}
class B: MyProto {
var x = 20
}
class Demo {
var type: MyProto!
init(str: String) {
if str == "0" {
type = A()
} else {
type = B()
}
}
}
...
let obj = Demo(str: "0").type
print(obj.x)