Swift新特性选项集合(OptionSet)详解
本篇中主要介绍Swift 2.0语言的新特性 -- Option Set,详细介绍其基本概念及代码示例。
位掩码
- 在写一个角色扮演的游戏(比如说传奇)游戏的角色可能拥有各种装备,比如盔甲,剑以及头盔等等。定义一个整数并使用它的比特位来进行表示。由于每个比特位只能存储 0 或者 1,可以使用它来对每个装备进行表示,这就是所谓的位掩码。
位掩码的操作:
struct Inventory: OptionSetType {
let rawValue: Int
static let Sword = Inventory(rawValue: 1)
static let Armor = Inventory(rawValue: 1 << 1)
static let Helmet = Inventory(rawValue: 1 << 2)
}
var inventory: Inventory = [.Sword, .Shield]
if inventory.contains(.Shield) {
print("屠龙在手,天下我有")
}
示例代码
import Foundation
struct Skills: OptionSetType {
let rawValue:Int
static let LOL = Skills(rawValue: 1)
static let GitHub = Skills(rawValue: 1<<1)
static let Personal = Skills(rawValue: 1<<2)
static let StackOverflow = Skills(rawValue: 1<<3)
}
struct Programmer {
var possibleSkills:Skills = [.LOL]
/**
由于要在方法里修改结构体中的属性,所以都得加上 mutating 修饰符。三个方法里都使用了 Set 集合的方法来对程序员的技能进行改变。
*/
mutating func quitLOL(){
if possibleSkills.contains(.LOL){
print("不要再玩了,快去写代码吧")
possibleSkills.subtractInPlace(.LOL)
}
}
mutating func signUpStackOverflow() {
if !possibleSkills.contains(.StackOverflow) {
possibleSkills.unionInPlace(.StackOverflow)
print("StackOverflow 帐号注册完毕,可以上去提问题了")
} else {
print("你已经有 StackOverflow 账号了,先去回答几个问题吧")
}
}
mutating func signUpGitHub() {
if !possibleSkills.contains(.GitHub) {
possibleSkills.unionInPlace(.GitHub)
print("GitHub 帐号注册完毕,快去骗 star 吧.")
} else {
print("你已经有 GitHub 了,请不要重复注册.")
}
}
}
var programmer = Programmer()
programmer.quitLOL()
programmer.signUpGitHub()
programmer.signUpStackOverflow()