当前,我正在尝试进行多类转换以执行某些操作,例如UIBarButtonItem或UIControl。
有没有办法在同一行上同时做这两项?喜欢:
if let x = sender as? UIControl, sender as? UIBarButtonItem {
print (x)
}
我已经尝试了很多方法,但是仍然无法在一行中强制转换多个类。
谢谢。
答案 0 :(得分:5)
Swift是一种静态类型的语言。所有变量都有一个在编译时就已知的类型。与动态类型的语言(Python,Ruby,Smalltalk,Javascript等)不同,无法直接执行以下操作:
let x: String or Int
if condition { x = 123 }
else { x = "string" }
想象一下是否有可能:如果sqrt(x)
是x
,String
的值是多少?如果x.uppercased()
是x
,Int
的值是什么?
相反,此类“ OR类型”被编码为枚举(将枚举的所有受支持成员明确枚举为具有关联值的案例)或协议。协议具有额外的好处,它们可以明确声明不符合标准的行为的预期行为,并且可以开放以符合将来的类型。
最通用的协议是Any
,它捕获所有类型。它的普遍性既是它的优势,也是它的劣势。尽管您可以为其分配任何值,但是由于 all 类型支持的操作很少,因此直接可以对其执行的操作很少。
对于您而言,最合适的方法是创建一个协议,将要访问的任何功能添加到其中,并使所需的类型符合该协议。
protocol Fooable {
func foo()
}
extension UIControl: Fooable {
func foo() {
print("I am a UIControl!")
}
}
extension UIBarButtonItem: Fooable {
func foo() {
print("I am a UIBarButtonItem!")
}
}
if let fooableThing = sender as? Fooable {
fooableThing.foo()
}