在使用CoreBluetooth框架将设备设置为外围设备管理器时,我在Swift如何处理枚举方面遇到了困难。

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

init!(type UUID: CBUUID!, properties: CBCharacteristicProperties, value: NSData!, permissions: CBAttributePermissions)
CBCharacteristicPropertiesInt支持的枚举。如果使用ObjectiveC,则初始化程序将通过使用按位OR properties运算符来接受|的多个值。在Swift中,enum不允许直接使用按位OR,但是可以在支持案例的rawValues上执行它:
let properties = CBCharacteristicProperties.Read.rawValue | CBCharacteristicProperties.Notify.rawValue

现在,properties的类型为Int,这意味着可以将而不是传递给上述初始化程序。 ('Int' is not convertible to 'CBCharactersiticProperties')因此,我尝试从“raw”值创建枚举的实例:
let cbProperties = CBCharacteristicProperties(rawValue: properties)

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

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

最佳答案

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

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

更新
尽管此语法在Xcode 6.2的iOS上有效,但不适用于OS X目标-看起来像个bug

10-08 05:46
查看更多