Я делаю кучу работы с [Uint8]
массивами. Но мне часто приходится переписывать их как объекты NSData
для взаимодействия с инфраструктурами iOS, такими как CoreBluetooth
. Так что у меня много кода, который может выглядеть примерно так:Swift: невозможно преобразовать значение типа «Я» в ожидаемый тип аргумента «UnsafePointer <Void> '
var input:[UInt8] = [0x60, 0x0D, 0xF0, 0x0D]
let data = NSData(bytes: input, length: input.count)
устать от того, чтобы вставить эту дополнительную let data = ...
линии, я думал, я бы просто расширить эти массивы с вычисленным свойством, чтобы сделать работу. Тогда я мог бы просто делать такие вещи, как:
aBluetoothPeriperal.write(myBytes.nsdata, ...)
Так что это в основном просто сахара-удлинитель. Я не могу расширить массив, но я могу продлить протокол:
extension SequenceType where Generator.Element == UInt8 {
var nsdata:NSData {
return NSData(bytes: self, length: self.count)
}
}
Который выдает ошибку, которая выглядит как:
Playground execution failed: MyPlayground.playground:3:24: error: cannot convert value of type 'Self' to expected argument type 'UnsafePointer<Void>' (aka 'UnsafePointer<()>')
return NSData(bytes: self, length: self.count)
^~~~
К сожалению, больше я использую Swift - и я действительно люблю некоторые вещи о Swift - тем больше я вспоминаю о своих негативных впечатлениях, пытаясь понять множество неудачных выходных данных компилятора, когда я попробовал свои силы на C++ с большим количеством дженериков и много лет назад. Поэтому, пожалуйста, Оби Ван, помогите мне увидеть свет здесь!
Как вы планируете вызывать расширение как это? Можете ли вы добавить код вызова? – ryantxr