Небезопасный указатель в 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.