Чтобы ответить на ваш ближайший вопрос: UInt32(intValue)
создает новое (постоянное) значение, адрес которого нельзя взять с помощью &
. Так
var intValue: UInt
scanner.scanHexInt32(&UInt32(intValue))
должно быть
var intValue: UInt32 = 0
scanner.scanHexInt32(&intValue)
И
dataBytes.append(&intValue, count: 1)
не компилируется, потому что &intValue
является указателем на целое число, а не на UInt8
. Здесь вы можете сделать
dataBytes.append(UInt8(intValue))
потому что значение известно для размещения в одном байте.
Сказав это, все преобразования из String
в NSString
не нужны. Более «Swifty» перевод этого кода Objective-C в Swift будет
func convertHex(toDataBytes hexStr: String) -> Data {
var dataBytes = Data()
var startPos = hexStr.startIndex
while let endPos = hexStr.index(startPos, offsetBy: 2, limitedBy: hexStr.endIndex) {
let singleHexStr = hexStr[startPos..<endPos]
let scanner = Scanner(string: String(singleHexStr))
var intValue: UInt32 = 0
scanner.scanHexInt32(&intValue)
dataBytes.append(UInt8(intValue))
startPos = endPos
}
return dataBytes
}
Альтернативный подход (включающий проверку ошибок) см., Например,
Преобразование шестнадцатеричной / двоичной строки в Swift