快速检查多种类型的转换

时间:2019-01-08 00:18:04

标签: ios swift

当前,我正在尝试进行多类转换以执行某些操作,例如UIBarButtonItem或UIControl。

有没有办法在同一行上同时做这两项?喜欢:

if let x = sender as? UIControl, sender as? UIBarButtonItem {
print (x)
}

我已经尝试了很多方法,但是仍然无法在一行中强制转换多个类。

谢谢。

1 个答案:

答案 0 :(得分:5)

Swift是一种静态类型的语言。所有变量都有一个在编译时就已知的类型。与动态类型的语言(Python,Ruby,Smalltalk,Javascript等)不同,无法直接执行以下操作:

let x: String or Int
if condition { x = 123 }
else { x = "string" }

想象一下是否有可能:如果sqrt(x)xString的值是多少?如果x.uppercased()xInt的值是什么?

相反,此类“ 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()
}