Подтвердить что ты не робот

Кастинг между различными UnsafePointer <T> в быстрых

Я пытаюсь использовать C-Api из swift. В качестве примера C-Api идет следующим образом:

void doThingsOnRawData(const unsigned char* data);

Swift преобразует это значение в:

void doThingsOnRawData(UnsafePointer<UInt8>);

Теперь я хочу передать данные из NSData в функцию. NSData.byte возвращает тип:

UnsafePointer<()>
  • Это какой-то тип void *?

  • По крайней мере, swift не примет его как UnsafePointer<UInt8>. Что мне делать, чтобы это сделать?

4b9b3361

Ответ 1

struct UnsafePointer<T> имеет конструктор

/// Convert from a UnsafePointer of a different type.
///
/// This is a fundamentally unsafe conversion.
init<U>(_ from: UnsafePointer<U>)

который вы можете использовать здесь

doThingsOnRawData(UnsafePointer<UInt8>(data.bytes))

Вы даже можете опустить общий тип, потому что он выводится из контекста:

doThingsOnRawData(UnsafePointer(data.bytes))

Обновление для Swift 3: Начиная с Xcode 8 beta 6, вы не можете конвертировать непосредственно между различными небезопасными указателями.

Для data: NSData, data.bytes есть UnsafeRawPointer, которое может преобразуется в UnsafePointer<UInt8> с помощью assumingMemoryBound:

doThingsOnRawData(data.bytes.assumingMemoryBound(to: UInt8.self))

Для data: Data это еще проще:

data.withUnsafeBytes { doThingsOnRawData($0) }