Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何定义可以是两个对象之一的变量?_Ios_Swift_Types_Any - Fatal编程技术网

Ios 如何定义可以是两个对象之一的变量?

Ios 如何定义可以是两个对象之一的变量?,ios,swift,types,any,Ios,Swift,Types,Any,非常简单,我有两种按钮类型,略有不同。我试图创建一个变量,该变量可以在以后的代码中处理这两种类型。大概是这样的: var button: Any If(condition one) button = NavButton() else button = IconButton() 我的按钮具有独特的设置功能。举个粗略的例子: button.setup(name: String) button.setup(int: Int) 当我调用它们时,超类/协议无法识别它们 如何做到最好?或者

非常简单,我有两种按钮类型,略有不同。我试图创建一个变量,该变量可以在以后的代码中处理这两种类型。大概是这样的:

var button: Any

If(condition one)
   button = NavButton()
else
   button = IconButton()
我的按钮具有独特的设置功能。举个粗略的例子:

button.setup(name: String)
button.setup(int: Int)
当我调用它们时,超类/协议无法识别它们


如何做到最好?或者这不是使用单个变量来完成的?我正在构建一个工厂类,它的函数几乎相同,只保存一个调用和一个参数

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

var button : UIButton

我的解决方案就是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)
}

希望这对其他人有所帮助。

好的,我的问题是每种按钮类型都有一种方法的唯一版本。设置(名称:String)与设置(int:int)。当我尝试调用button.setup()上的后续调用时,由于未知的唯一性,它会抛出错误。我将更新上面的内容来说明这一点。对同一个函数名使用两个具有不同参数的子类没有多大意义;您需要一些逻辑来确定在给定实例上调用哪个函数,因此您也可以使用两个不同的函数,例如
setupWithString(String)
setupWithInt(Int)
,这样您就可以使用单个超类了。看,就是这样。我不确定什么是正常的。我已经有一段时间没写这类代码了。非常感谢。