当前位置:   iOS > 正文

枚举数组是Swift的枚举?

cocoa-touch,swift,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

我正在关注Apple的Swift/iOS教程,它具有以下代码:

button.setImage( filledStarImage, forState: [UIControlState.Highlighted, UIControlState.Selected] )

但是UIButton.setImage签名的定义是:

public func setImage(image: UIImage?, forState state: UIControlState)

没有重载setImage接受[UIControlState]()数组.

显然有些伏都教正在进行,任何人都可以解释一下吗?



1> dfri..:

在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"的访问,因为它们具有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

查看符合的实例方法(参见下面的语言参考链接)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

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号