2016-11-30 3 views
2

Я укусил пулю и начал конвертировать мое приложение в Swift 3. Как всегда, конвертер оставляет желать лучшего. В этом случае я не уверен, как правильно кодировать новую версию. Вот оригинал:SCNGeometryElement setup в Swift 3

let indexes : [CInt] = [0,1,2,3] 
let dat = NSData(bytes: indexes, length: sizeofValue(indexes)) 
let ele = SCNGeometryElement(data:dat, primitiveType: .Triangles, primitiveCount: 2, bytesPerIndex: sizeof(Int)) 

После запуска преобразования и записи нового SizeOf (спасибо), я закончил с этим:

let indexes : [CInt] = [0,1,2,3] 
let dat = Data(bytes: UnsafePointer<UInt8>(indexes), count: sizeof(indexes)) 
let ele = SCNGeometryElement(data:dat, primitiveType: .triangles, primitiveCount: 2, bytesPerIndex: MemoryLayout<Int>.size) 

Однако, это дает мне (на Data(bytes:length:) вызова):

«init» недоступен: используйте «withMemoryRebound (to: capacity: _)», чтобы временно просмотреть память как другой совместимый с макета тип.

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

ответ

6

Вы установили один sizeof, но не другой, и вы создаете новый указатель там, где это не нужно - любой массив (с учетом правильного типа элемента) может быть передан API-интерфейсам, которые принимают указатели стиля C. Прямое исправление кода является то:

let indexes: [CInt] = [0,1,2,3] 
let dat = Data(bytes: indexes, count: MemoryLayout<CInt>.size * indexes.count) 
let ele = SCNGeometryElement(data:dat, primitiveType: .triangles, primitiveCount: 2, bytesPerIndex: MemoryLayout<CInt>.size) 

(Обратите также внимание на исправления, чтобы сделать ваш MemoryLayout s согласуется с данными, которые они описывают.)

Однако, если у вас нет какой-то необходимость дополнительного Data объекта , для развлечения с указателями, или для дополнительной специфичности в описании вашего элемента, вы можете использовать более простую форму:

let indices: [UInt8] = [0,1,2,3] 
let element = SCNGeometryElement(indices: indices, primitiveType: .triangles) 

This generic initializer автоматически управляет памятью на пути в, выводит количество массива, d указывает primitiveCount на основе количества массивов и заданного вами primitiveType.

(Обратите внимание, что массив из четырех индексов является необычным числом для .triangles, либо у вас есть один треугольник и один неиспользуемый индекс, или вы на самом деле означать .triangleStrip, содержащий два примитива.)

+0

Это отличный ответ, так как всегда, рикер. Я очень благодарен за упрощение. Как ни странно, оригинальная трехстрочная версия исходит из собственных примеров Apple. –

+0

Старый пример, вероятно, никогда не обновлялся. Я обнаружил, что они часто делают быстрые исправления, когда вы [ошибка файла с документацией разработчика] (http://bugreport.apple.com). – rickster