2016-12-13 8 views
1

Я полный Swift новичок, но я пишу приложение для BLE с помощью swift и столкнулся с проблемой. Я работаю над каким-то открытым исходным кодом, который я нашел, чтобы понять, как структурировать приложение iOS и общаться с BLE, и когда я преобразовал его в Swift 3, возникло множество ошибок.Swift 3 Conversion, что приводит к тому, что «невозможно передать неизменяемый как inout»

Код:

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

Ошибка:

Cannot pass immutable value as inout argument: function call returns immutable value

Я искал в Интернете для решения этого и обнаружили следующее:

Я пытался реализовать эти, взглянуть на следующие строки кода:

if let data = characteristic.value { 
    var bytes = Array(repeating: 0 as UInt8,count:someData.count/MemoryLayout<UInt8>.size) 
    data.copyBytes(to: &bytes, count:data.count) 
} 

и

let data = "foo".data(using: .utf8)! 
let array = [UInt8](data) 
let array = data.withUnsafeBytes { 
    [UInt8](UnsafeBufferPointer(start: $0, count: data.count)) 
} 

Я не очень понимаю корреляцию между ними, чем другие несколько общих переменных. Может кто-то объяснить, что происходит внутри функции CopyBytes (что делают «to» и «count»), откуда исходит ошибка, и если примеры, которые я рассматривал, имеют какое-либо отношение к методу I ' m пытается исправить?

+0

@Martin R Я смущен, почему вы отметили мой вопрос, как дубликат, когда другой был задан месяц после того, как шахта была ....? – zmillard

+1

Временное упорядочение дубликатов не имеет значения. Пользователи обычно выбирают вопрос с лучшими ответами как «главный» вопрос. Нет никакого штрафа за то, что ваш вопрос отмечен как дубликат, поэтому на самом деле не о чем беспокоиться. –

+0

Ой хорошо получилось, спасибо @CodyGray – zmillard

ответ

1

Похоже, что возникла проблема с типом отливки от Int8 до UInt8 и с адресом получаемого преобразования UInt8. Результат приведения - неизменяемое значение, память которого не может быть передана как аргумент функции. Если вы просто инициализируете переменную как unsigned int, она должна просто передать адрес.

Следующий код должен работать:

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

Обратите внимание, что 'Int8 (value)' сбой во время выполнения, если 'value' находится за пределами диапазона 0 ... 127. Сравните http://stackoverflow.com/a/41653097/1187415. –

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

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