2016-06-08 58 views
-1

我正在創建一個類,它使用swift的optionsettype協議,我從目標C枚舉轉換。我看到它們如何有助於提供有關操作或對象狀態的信息,例如操縱桿或滾動的方向。我無法圍繞如何將某些按位運算符轉換爲更快捷的方式困難。使用OptionSetTypes,將如何使用和賦值(&=)或或賦值(| =)?

從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

您錯過了Swift的選項集類型。這個想法是,你做而不是使用按位「和」或「或」。你可以,但你不可以,因爲它們容易出錯和混亂。相反,您使用集合操作。

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中做的任何。正是這種類似集合的行爲賦予了期權套的價值。

+0

有關完整的討論,請參閱我的在線圖書:http://www.apeth.com/swiftBook/ch04.html#SECoptionsSets – matt