2016-11-30 114 views
2

我咬緊牙關,開始將我的應用程序轉換爲Swift 3.與往常一樣,轉換器還有很多不足之處。在這種情況下,我不確定如何正確編碼新版本。以下是原文:Swift 3中的SCNGeometryElement設置

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:)調用):

「初始化」是不可用:使用「withMemoryRebound(到:容量:_)」到臨時查看存儲器作爲另一佈局兼容型。

我已經在這裏看過幾個主題,並閱讀了發佈說明,涵蓋了這一點,而且我仍然對這裏應該做的事情感到困惑。

回答

6

您修復了一個sizeof而不是另一個,並且您正在創建一個新指針,因爲這是不必要的 - 任何數組(如果給出正確的元素類型)都可以傳遞給採用C風格指針的API。爲您的代碼直接修復則是:

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一貫與它們所描述的數據。)

但是,除非你有一些需要額外Data對象,與指針的樂趣,或者在描述你的元素額外的特殊性,您可以用簡單的形式:

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

This generic initializer自動管理上的方式存儲,推斷陣列的數量,一個d根據您指定的陣列的數量和primitiveType推斷primitiveCount

(請注意,四個索引的陣列爲.triangles一個不尋常的數目;或者你有一個三角形和一個未使用的索引,或者實際上意味着包含兩個基元.triangleStrip。)

+0

這是一個極好的答案,作爲總是,rickter。我非常感謝簡化。具有諷刺意味的是,原來的三線版本來自蘋果自己的例子。 –

+0

更老的例子,可能永遠不會更新。我發現當你[對開發者文檔提出錯誤文檔](http://bugreport.apple.com)時,他們經常會做出快速修復。 – rickster