我發現Swift
和NSData
是一種不聖潔的沮喪婚姻。每當我處理這件事情時,我發現我覺得所有新發現的Swift安全都會出現在窗外。崩潰的數量(無益的痕跡)沒有幫助。使用Swift從NSData中獲取數據
所以,我瞭解到,我可以做這樣的事情下面避免可怕的UnsafeMutablePointer
東西:
var bytes = [UInt8](count: 15, repeatedValue: 0)
anNSData.getBytes(&bytes, length=15)
我還發現,我可以直接解壓縮到奇異值:
var u32:UInt32 = 0
anNSData.getBytes(&u32, length=4)
這導致了兩個中間問題:
1)有什麼我可以使用,比那裏的硬編碼常量更可靠。如果這是C,我只使用sizeof
。但我想我讀了,也許我應該使用strideof
而不是sizeof
?這不會在[UInt8]
的工作,是嗎?
2)文檔(對於Swift)說這個參數應該是_ buffer: UnsafeMutablePointer<Void>
。那麼這是如何工作的?我幸運嗎?爲什麼我想要這樣做,而不是更原生/託管的[Uint8]結構?我想知道如果UnsafeMutablePointer
是一個協議,但它是一個結構。
通過直接讀取數值(而不是數組),我想也許我可以嘗試另一種結構。我有一個6字節結構,看起來像:
struct TreeDescription : Hashable {
var id:UInt32 = 0x00000000
var channel:UInt8 = 0x00
var rssi:UInt8 = 0x00
var hashValue:Int {
return Int(self.id)
}
}
哪些實際工作(認爲它沒有,但最終做一個乾淨的,其取得了一些崩潰消失後)!
var tree = TreeDescription()
anNSData.getBytes(&newTree, length: 6)
但是這讓我擔心結構包裝的細節?爲什麼這個工作?我該怎麼擔心這樣做?
對我來說,這一切都感覺非常C-ISH。我認爲Swift把C從ObjectiveC中拿出來了。
我可能要看一看這一點。但它並沒有真正幫助我理解爲什麼其他結構(排列或不排列)似乎也能正常工作。 –
@TravisGriggs更新了我的答案,看看 – Kametrixom
不錯。我想,我快到了。仍然不清楚爲什麼一個[UInt8]可以直接放入UnsafeMutablePointer的地方?是否是inout運算符(&)的本質?我注意到我可以用上面的技巧來構建一個'NSData'。例如。 'NSData(&myStruct,sizeof(myStruct))',它工作正常。我的天真觀察是,&beforeVariable與C中的相似 –