为了账号安全,请及时绑定邮箱和手机立即绑定

往返数据的SWIFT编号类型

往返数据的SWIFT编号类型

桃花长相依 2019-06-29 17:53:37
往返数据的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中,我会在它前面打一个符号,然后你就可以了。
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

你可以得到一个不安全的指针可变对象使用withUnsafePointer:

withUnsafePointer(&input) { /* $0 is your pointer */ }

我不知道为不可变对象获取一个的方法,因为InOut操作符只对可变对象工作。

这一点在您所链接的答案中得到了证明。


查看完整回答
反对 回复 2019-06-29
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

就我而言,马丁R他的回答很有帮助,但结果却是颠倒过来的。所以我对他的代码做了一个小小的修改:

extension UInt16 : DataConvertible {

    init?(data: Data) {
        guard data.count == MemoryLayout<UInt16>.size else { 
          return nil 
        }
    self = data.withUnsafeBytes { $0.pointee }
    }

    var data: Data {
         var value = CFSwapInt16HostToBig(self)//Acho que o padrao do IOS 'e LittleEndian, pois os bytes estavao ao contrario         return Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
    }}

这个问题与LittleEndian和BigEndian有关。


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 519 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信