【问题标题】:Swift enum and CBCharacteristicPropertiesSwift 枚举和 CBCharacteristicProperties
【发布时间】:2015-04-02 19:26:21
【问题描述】:

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

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

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

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

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

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

let cbProperties = CBCharacteristicProperties(rawValue: properties)

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

是否有可能在 Swift 中实现这一点?

【问题讨论】:

    标签: ios swift enums core-bluetooth


    【解决方案1】:

    目标-C:

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

    斯威夫特:

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

    【讨论】:

      【解决方案2】:

      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 目标 - 看起来像一个错误

      【讨论】:

      • 这不会编译。 Extra argument 'string' in call
      • 您使用的是什么版本的 Xcode?我有 6.2,如果我省略“字符串:”,它会抱怨。
      • let props = CBCharacteristicProperties.Read|CBCharacteristicProperties.Write 也适用于 Playground,但不会在项目中编译。任何想法为什么?
      • 我创建了一个新的单视图 swift 应用程序,添加了 CoreBluetooth 框架,将 CoreBluetooth 导入到 swift 文件中并粘贴了我的答案中的行。它编译
      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 2023-03-26
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2016-01-16
      相关资源
      最近更新 更多