当前位置:  开发笔记 > IOS > 正文

枚举数组是Swift的枚举?

如何解决《枚举数组是Swift的枚举?》经验,为你挑选了1个好方法。

我正在关注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

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有