Swift 枚举和 CBCharacteristicProperties

Swift enum and CBCharacteristicProperties

在使用 CoreBluetooth 框架将设备设置为外设管理器时,我 运行 对如何 Swift 处理枚举感到困难。

具体来说,CBMutableCharacteristic 的初始化程序采用 enum 作为 properties 参数:

init!(type UUID: CBUUID!, properties: CBCharacteristicProperties, value: NSData!, permissions: CBAttributePermissions)

CBCharacteristicProperties 是一个 Int 支持的枚举。如果使用 ObjectiveC,初始化程序将通过使用按位或 | 运算符接受 properties 的多个值。在 Swift 中, enum 不允许直接使用按位或,但可以在 rawValues 上执行它支持案例:

let properties = CBCharacteristicProperties.Read.rawValue | CBCharacteristicProperties.Notify.rawValue

现在,propertiesInt 类型,这意味着它 不能 传递给上面的初始化器。 ('Int' is not convertible to 'CBCharactersiticProperties') 因此,我尝试从 "raw" 值创建枚举实例:

let cbProperties = CBCharacteristicProperties(rawValue: properties)

但是,在运行时这会解析为 nil。按位或运算得到的 Int 与任何 enum 情况都不匹配。将 properties 参数的 nil 传递给初始化程序会导致运行时错误。

是否可以在 Swift 中完成此操作?

语法 Swift 与 Objective C 完全相同 - 使用 |分隔值的字符 -

var someCharacteristic=CBMutableCharacteristic(type: CBUUID(string:"someUUID"), 
  properties:CBCharacteristicProperties.Read|CBCharacteristicProperties.Write ,
  value: nil, 
  permissions: CBAttributePermissions.Readable|CBAttributePermissions.Writeable)

更新 虽然此语法适用于 iOS 和 Xcode 6.2,但不适用于 OS X 目标 - 看起来像一个错误

Objective-C:

[[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:CHARACTERISTIC_UUID]
                                   properties:CBCharacteristicPropertyNotify |
                                   CBCharacteristicPropertyRead
                                   value:nil
                                   permissions:CBAttributePermissionsReadable]

Swift:

CBMutableCharacteristic(type: CBUUID(string:CHARACTERISTIC_UUID),
                                properties: [CBCharacteristicProperties.Read,CBCharacteristicProperties.Notify],
                                value: nil,
                                permissions: CBAttributePermissions.Readable)