关于OptionSetType的使用

假如不久的将来出现一种智能钥匙,它可以适用于各种锁(当然是确认身份之后)。

一个三口之家:

  • 小明
  • 小明他妈
  • 小明他爸

显然每个只需要这样一把钥匙就够了。家里有三种锁需要开(简单点啰)

  • 车锁(爸爸妈妈能开)
  • 门锁(三个人都能开)
  • 保险柜锁(只有爸爸能开)

于是三个人需要三种不同的授权。
以前可能是这样的(当然为了好看点,也可以将几种 权限定义在结构体里或枚举里)

const int kDoorLock       = 1<<0
const int kCarLock        = 1<<1
const int kSafeboxLock    = 1<<2
int xiaomingKeyFlags =  kDoorLock
int mamaKeyFlags     = kCarLock | kDoorLock
int babaKeyFlags     = kCarLock | kDoorLock | kSafeboxLock

而现在在 swift 里有了更加优雅的做法,专治这种位掩码(可 bitwiseXXX)
现在可能是这样的

struct KeyFlags : OptionSetType {
  let rawValue: Int
    static let DoorLock   =  KeyFlags(rawValue: 1)
    static let CarLock   =  KeyFlags(rawValue: 2)
    static let SafeboxLock   =  KeyFlags(rawValue: 4)
}

let xiaomingKeyFlags =  [.DoorLock]
let mamaKeyFlags = [.DoorLock, .CarLock]
let babaKeyFlags = [.DoorLock, .CarLock, .SafeboxLock]

定义看起来换汤不换药嘛,但是使用起来就爽多了

if xiaomingKeyFlags.contains([.CarLock]){
  print("have permission to drive the car!")
}

完全不用做位解析了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容