如何定义一个可能是两个对象之一的var?

时间:2016-03-13 06:42:02

标签: ios swift types any

真的很简单,我有两种按钮类型略有不同。我正在尝试创建一个可以在代码中稍后处理这两种类型的变量。像这样:

var button: Any

If(condition one)
   button = NavButton()
else
   button = IconButton()

我的按钮具有独特的设置功能。作为一个粗略的例子:

button.setup(name: String)
button.setup(int: Int)

当我调用它们时,超类/协议无法识别它们。

这怎么做得最好?或者这不是使用单个变量吗?我正在构建一个几乎完全相同的工厂类,保存ONE调用和ONE参数。

2 个答案:

答案 0 :(得分:1)

最明显的方法是将其声明为UIButton,假设两者都是实际按钮。

var button : UIButton

答案 1 :(得分:0)

我的解决方案是Paulw11提到的。我需要为每个参数类型创建两个独特的超级函数。大多数人可能都很明显,但如果没有,那就是答案。

我创建了一个协议,然后将其扩展为具有两个函数的超类。我认为使用超类作为初始类型,然后在后续行中更改它们,门控独特的方法。

protocol MyButton {
    func setupString(s: String)
    func setupInt(i: Int)
}
public class CustomButton: UIButton, MyButton {
    func setupString(s: String) {}
    func setupInt(i: Int) {}
}

class ButtonString:CustomButton {
    override func setupString(s: String) {}
}

class ButtonInt:CustomButton {
    override func setupInt(i: Int) {}
}

然后按照这样使用它们:

var myButton: CustomButton = CustomButton()

if(string) {
    myButton = ButtonString()
    myButton.setupString("Hello World")
} else {
    myButton = ButtonInt()
    myButton.setupInt(42)
}

希望这有助于某人。