我正在关注Apple的Swift/iOS教程,它具有以下代码:
button.setImage( filledStarImage, forState: [UIControlState.Highlighted, UIControlState.Selected] )
但是UIButton.setImage
签名的定义是:
public func setImage(image: UIImage?, forState state: UIControlState)
没有重载setImage
接受[UIControlState]()
数组.
显然有些伏都教正在进行,任何人都可以解释一下吗?
在Swift中,UIControlState
本身并不是一个枚举,而是一个结构.从语言参考UIControl
:
控制状态
控制的状态; 控件一次可以有多个状态.根据控制,各国的认可程度不同.例如,可以配置UIButton实例(使用setImage:forState:方法)以在处于正常状态时显示一个图像,在突出显示时显示不同的图像.
宣言
struct UIControlState : OptionSetType { init(rawValue rawValue: UInt) static var Normal: UIControlState { get } static var Highlighted: UIControlState { get } static var Disabled: UIControlState { get } static var Selected: UIControlState { get } static var Focused: UIControlState { get } static var Application: UIControlState { get } static var Reserved: UIControlState { get } }
这里的关键是OptionSetType
协议(UIControlState
符合),它允许我们对静态结构属性进行"类似enum"的访问,因为它们具有RawValue
a BitwiseOperationsType
.例如:
struct MyStruct : OptionSetType { private var value: UInt var rawValue: UInt { return self.value } init(rawValue value: UInt) { self.value = value } static var Normal: MyStruct { return self.init(rawValue: 1 << 0) } static var Highlighted: MyStruct { return self.init(rawValue: 1 << 1) } static var Disable: MyStruct { return self.init(rawValue: 1 << 2) } // ... } let MyOptionsA : MyStruct = [MyStruct.Normal, MyStruct.Disable] let MyOptionsB : MyStruct = [.Normal, .Disable] MyOptionsB.contains(.Highlighted) // false MyOptionsB.contains(.Normal) // true
查看符合的实例方法(参见下面的语言参考链接)OptionsSetType
.此外会员管理(例如.contains(...)
如上;而且,.remove(...)
,.insert(..)
),纯组操作,例如union(...)
和intersect(...)
提供.
总结一下; 你是正确的,UIButton.setImage
签名要求forState state: UIControlState
,但是,由于OptionSetType
协议,数组外观[UIControlState.Highlighted, UIControlState.Selected]
实际上是调用结构类型参数的有效参数UIControlState
.
另请注意,根据上面的示例,结构名称可以省略,因此[.Highlighted, .Selected]
作为forState
参数发送也同样合适.
参考和好读:
OptionSetType协议语言参考
你如何在Swift中枚举OptionSetType?
http://www.informit.com/articles/article.aspx?p=2420231