根据变量选择类

时间:2016-03-21 17:03:24

标签: swift

我有两个类ClassOne和ClassTwo。我想根据变量值初始化另一个,我想做类似的事情:

if(a == "0") {
let b = ClassOne();
}else{
let b = ClassTwo();
}

无需每次需要时都写它。就像是: 让b = MainClass() 根据具体情况调用ClassOne()ClassTwo(),a是全局变量。

4 个答案:

答案 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)

注意:您可以通过关注matt advise来放弃上述所有内容,转而采用完全动态的方法。

答案 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)