Небезопасный указатель в Swift 3

Я знаю, что этот вопрос задавался несколько раз, но я действительно не понимаю его.

Я хочу извлечь значение из устройства Bluetooth (Miband). В Swift 2 это работало так:

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    if characteristic.uuid.uuidString == "FF06" {
        let value = UnsafePointer<Int>(characteristic.value!.bytes).memory
        print("Steps: \(value)")
    }
}

Но в swift 3 выдает ошибку:

Cannot invoke initializer for type 'UnsafePointer<Int>' with an argument list of type '(UnsafeRawPointer)'

И я понятия не имею, как перенести это на быстрое 3.

1 ответ

Решение

Ты можешь использовать withUnsafeBytes с pointee:

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    if characteristic.uuid.uuidString == "FF06" {
        let value = characteristic.value!.withUnsafeBytes { (pointer: UnsafePointer<Int>) -> Int in
            return pointer.pointee
        }
        print("Steps: \(value)")
    }
}

Если UnsafePointer указывал на массив Pointee, тогда вы можете использовать оператор индекса, например, pointer[0], pointer[1]и т. д., а не pointer.pointee,

Для получения дополнительной информации см. SE-0107.

Другие вопросы по тегам