ios 快速检查多型号铸件

wgeznvg7  于 2022-12-24  发布在  iOS
关注(0)|答案(2)|浏览(110)

目前,我正在尝试进行多个类转换,以执行一些操作,如UIBarButtonItem或UIControl。
有没有办法在同一行中同时执行这两个操作?例如:

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

我尝试了很多方法,但仍然不能在一行中投多个类。
谢谢。

lnxxn5zx

lnxxn5zx1#

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

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

想象一下如果有可能:如果xStringsqrt(x)的值是多少?如果xIntx.uppercased()的值是多少?
相反,这种“OR类型”被编码为枚举(将所有支持的成员显式枚举为具有关联值的case)或协议。协议有一个额外的好处,即它们显式地声明了一致类型的预期行为,并且它们对未来类型的一致性是开放的。
最通用的协议是Any,它捕获ALL类型,它的通用性既是它的优点也是它的缺点,虽然你可以给它赋任何值,但你不能直接用它做什么,因为 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()
}
1sbrub3j

1sbrub3j2#

可以使用开关进行类型转换:

switch sender {
case let x as UIControl:
    print(x)
case let x UIBarButtonItem:
    print(x)
default:
    break
}

Swift docs中的更多信息,请访问:https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html

相关问题