2015-04-02 218 views
2

雖然使用CoreBluetooth框架將設備設置爲外圍管理器,但我遇到了Swift如何處理枚舉的困難。Swift枚舉和CBCharacteristic屬性

具體而言,CBMutableCharacteristic初始化需要一個enumproperties論點:

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

CBCharacteristicPropertiesInt -backed枚舉。如果使用ObjectiveC,則初始化程序將通過使用按位OR OR |運算符接受properties的多個值。在斯威夫特的enum不直接允許使用按位OR,但可以在rawValues執行它那回的案件:

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

現在,propertiesInt型的,這意味着它可以是傳遞給上述初始化程序。 ('Int' is not convertible to 'CBCharactersiticProperties')。因此,我試圖從「原始」值創建枚舉的一個實例:

let cbProperties = CBCharacteristicProperties(rawValue: properties) 

然而,在運行時該解析爲nil。由按位OR產生的Intenum中的任何一個都不匹配。將nilproperties參數傳遞給初始值設定項會導致運行時錯誤。

在Swift中可以做到這一點嗎?

回答

-1

語法是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的目標努力 - - 字符來分隔值看起來像一個錯誤

+0

這並不編譯。 '在調用中額外的參數'字符串' – Brad 2015-04-02 20:19:20

+0

它適用於我在遊樂場 – Paulw11 2015-04-02 20:20:25

+0

你使用的是什麼版本的Xcode?我有6.2,它會抱怨,如果我省略「字符串:」。 – Paulw11 2015-04-02 20:25:10

5

的Objective-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)