2017-01-14 11 views
0

Я разветвил этот проект, поэтому я не так хорошо знаком со всеми деталями: https://github.com/nebs/hello-bluetooth/blob/master/HelloBluetooth/NSData%2BInt8.swift.Невозможно передать неизменяемое значение как аргумент inout: вызов функции возвращает неизменяемое значение

Все это часть расширения NSData, которое я использую для отправки 8-битных значений в Arduino.

func int8Value() -> Int8 { 
    var value: Int8 = 0 
    copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size) //BUG 

    return value 
} 

enter image description here

Однако, по-видимому, в Swift 3, что это сейчас выдает ошибку в разделе copyBytes. Хотя я видел некоторые решения, такие как передача адреса в параметре, я не хотел рисковать сломать оставшиеся части кода. Любые предложения о том, что делать для этого?

ответ

2

Оригинальный код был неверен. UInt8(value) генерирует новое неизменяемое значение, которое вы не можете записать. Я предполагаю, что старый компилятор просто позволяет вам уйти с ним, но это было неправильно.

Что они хотели сделать, это написать ожидаемый тип, а затем преобразовать тип в конец.

extension Data { 
    func int8Value() -> Int8 { 
     var value: UInt8 = 0 
     copyBytes(to: &value, count: MemoryLayout<UInt8>.size) 

     return Int8(value) 
    } 
} 

Таким образом, сегодня я бы этого не делал. Data будет принуждать его значение любого типа вы хотите автоматически, так что этот способ является более безопасным и простым и очень общим:

extension Data { 
    func int8ValueOfFirstByte() -> Int8 { 
     return withUnsafeBytes{ return $0.pointee } 
    } 
} 

Или это способ, который является специфичным для Интсов (и даже проще):

extension Data { 
    func int8Value() -> Int8 { 
     return Int8(bitPattern: self[0]) 
    } 
} 
+0

Удивительное объяснение! Спасибо огромное! –

+0

Вы хотели использовать инициализатор 'init (bitPattern:)' Int8 'для первого и последнего примеров, не так ли? – Hamish

+0

Я этого не делал, но ты прав. То, как я его написал, рухнет. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^