目前,我正在尝试进行多个类转换,以执行一些操作,如UIBarButtonItem或UIControl。有没有办法在同一行中同时执行这两个操作?例如:
if let x = sender as? UIControl, sender as? UIBarButtonItem { print (x) }
我尝试了很多方法,但仍然不能在一行中投多个类。谢谢。
lnxxn5zx1#
Swift是一种静态类型语言,所有变量都有一个在编译时已知的类型,不像动态类型语言(Python、Ruby、Smalltalk、Javascript等),它无法直接执行以下操作:
let x: String or Int if condition { x = 123 } else { x = "string" }
想象一下如果有可能:如果x是String,sqrt(x)的值是多少?如果x是Int,x.uppercased()的值是多少?相反,这种“OR类型”被编码为枚举(将所有支持的成员显式枚举为具有关联值的case)或协议。协议有一个额外的好处,即它们显式地声明了一致类型的预期行为,并且它们对未来类型的一致性是开放的。最通用的协议是Any,它捕获ALL类型,它的通用性既是它的优点也是它的缺点,虽然你可以给它赋任何值,但你不能直接用它做什么,因为 all 类型支持的操作很少。在您的情况下,最合适的做法是制定一个协议,向其中添加您想要访问的任何功能,并使您想要的类型与之一致。
x
String
sqrt(x)
Int
x.uppercased()
Any
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() }
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
2条答案
按热度按时间lnxxn5zx1#
Swift是一种静态类型语言,所有变量都有一个在编译时已知的类型,不像动态类型语言(Python、Ruby、Smalltalk、Javascript等),它无法直接执行以下操作:
想象一下如果有可能:如果
x
是String
,sqrt(x)
的值是多少?如果x
是Int
,x.uppercased()
的值是多少?相反,这种“OR类型”被编码为枚举(将所有支持的成员显式枚举为具有关联值的case)或协议。协议有一个额外的好处,即它们显式地声明了一致类型的预期行为,并且它们对未来类型的一致性是开放的。
最通用的协议是
Any
,它捕获ALL类型,它的通用性既是它的优点也是它的缺点,虽然你可以给它赋任何值,但你不能直接用它做什么,因为 all 类型支持的操作很少。在您的情况下,最合适的做法是制定一个协议,向其中添加您想要访问的任何功能,并使您想要的类型与之一致。
1sbrub3j2#
可以使用开关进行类型转换:
Swift docs中的更多信息,请访问:https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html