使用OptionSetTypes时,如何使用和赋值(& =)或赋值(| =)?

时间:2016-06-08 02:12:37

标签: objective-c swift bitwise-operators

我正在创建一个使用swift的optionsettype协议的类,我从目标C enum转换。我看到他们如何能够提供有关动作或对象状态的信息,例如操纵杆或滚动的方向。我无法解决某些按位运算符转换为更快的问题。

来自OptionSetType协议文档:

struct PackagingOptions : OptionSetType {
    let rawValue: Int
    init(rawValue: Int) { self.rawValue = rawValue }

    static let Box = PackagingOptions(rawValue: 1)
    static let Carton = PackagingOptions(rawValue: 2)
    static let Bag = PackagingOptions(rawValue: 4)
    static let Satchel = PackagingOptions(rawValue: 8)
    static let BoxOrBag: PackagingOptions = [Box, Bag]
    static let BoxOrCartonOrBag: PackagingOptions = [Box, Carton, Bag]
}

var packagingOptions: PackingOptions = .Box

if packingOptions == .Box {
    packingOptions |= .Satchel
}

它会被翻译成以下内容吗?

packaingOptions = [PackagingOptions,.Satchel]

我相信它与按位或赋值具有相同的效果。在上述场景中如何工作和分配?

1 个答案:

答案 0 :(得分:1)

你错过了Swift的Option Set类型。这个想法是你使用按位“和”或“或”。你可以,但你没有,因为它们容易出错并且容易混淆。相反,您使用 set 操作。

var packagingOptions: PackagingOptions = [.Box] // it's a _set_
if somethingOrOther {
    packagingOptions.insert(.Satchel) // it's a _set_
}

同样,是的,你可以

var packagingOptions: PackagingOptions = [.Box, .Satchel] // it's a _set_

而且,反过来说,您可以通过检查集合的内容来检查特定位:

if packagingOptions.contains(.Box) ... // it's a _set_

你不能在Objective-C中做任何。正是这种类似集合的行为赋予了Option Set它的价值。