猿问

往返数据的SWIFT编号类型

往返数据的SWIFT编号类型

斯威夫特3倾向于Data而不是[UInt8],我正在尝试找出哪种最有效/惯用的方式将各种数字类型(UInt 8、Double、Float、Int 64等)编码/解码为数据对象。

这是使用[UInt 8]的答案,但它似乎在使用数据上找不到的各种指针API。

我想基本上是一些自定义扩展,类似于:

let input = 42.13 // implicit Doublelet bytes = input.datalet roundtrip = bytes.to(Double) // --> 42.13

真正让我无法理解的是,我已经看过了一堆文档,我是如何得到某种指针的(OpaquePoter,BufferPoter,还是Unsecurity Poter?)从任何基本结构(所有的数字都是)。在C中,我会在它前面打一个符号,然后你就可以了。


桃花长相依
浏览 520回答 3
3回答

ibeautiful

你可以得到一个不安全的指针可变对象使用withUnsafePointer:withUnsafePointer(&input) { /* $0 is your pointer */ }我不知道为不可变对象获取一个的方法,因为InOut操作符只对可变对象工作。这一点在您所链接的答案中得到了证明。

红糖糍粑

就我而言,马丁R他的回答很有帮助,但结果却是颠倒过来的。所以我对他的代码做了一个小小的修改:extension&nbsp;UInt16&nbsp;:&nbsp;DataConvertible&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;init?(data:&nbsp;Data)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;guard&nbsp;data.count&nbsp;==&nbsp;MemoryLayout<UInt16>.size&nbsp;else&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nil&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;=&nbsp;data.withUnsafeBytes&nbsp;{&nbsp;$0.pointee&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;data:&nbsp;Data&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;value&nbsp;=&nbsp;CFSwapInt16HostToBig(self)//Acho&nbsp;que&nbsp;o&nbsp;padrao&nbsp;do&nbsp;IOS&nbsp;'e&nbsp;LittleEndian,&nbsp;pois&nbsp;os&nbsp;bytes&nbsp;estavao&nbsp;ao&nbsp;contrario&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Data(buffer:&nbsp;UnsafeBufferPointer(start:&nbsp;&value,&nbsp;count:&nbsp;1)) &nbsp;&nbsp;&nbsp;&nbsp;}}这个问题与LittleEndian和BigEndian有关。
随时随地看视频慕课网APP
我要回答