我正在关注Apple的Swift/iOS教程,它具有以下代码:
button.setImage( filledStarImage, forState: [UIControlState.Highlighted, UIControlState.Selected] )
Run Code Online (Sandbox Code Playgroud)
但是UIButton.setImage签名的定义是:
public func setImage(image: UIImage?, forState state: UIControlState)
Run Code Online (Sandbox Code Playgroud)
没有重载setImage接受[UIControlState]()数组.
显然有些伏都教正在进行,任何人都可以解释一下吗?
在Swift中,UIControlState本身并不是一个枚举,而是一个结构.从语言参考UIControl:
控制状态
控制的状态; 控件一次可以有多个状态.根据控制,各国的认可程度不同.例如,可以配置UIButton实例(使用setImage:forState:方法)以在处于正常状态时显示一个图像,在突出显示时显示不同的图像.
宣言
Run Code Online (Sandbox Code Playgroud)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"的访问,因为它们具有RawValuea 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
Run Code Online (Sandbox Code Playgroud)
查看符合的实例方法(参见下面的语言参考链接)OptionsSetType.此外会员管理(例如.contains(...)如上;而且,.remove(...),.insert(..)),纯组操作,例如union(...)和intersect(...)提供.
总结一下; 你是正确的,UIButton.setImage签名要求forState state: UIControlState,但是,由于OptionSetType协议,数组外观[UIControlState.Highlighted, UIControlState.Selected]实际上是调用结构类型参数的有效参数UIControlState.
另请注意,根据上面的示例,结构名称可以省略,因此[.Highlighted, .Selected]作为forState参数发送也同样合适.
参考和好读:
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |