【问题标题】:Usage of withMemoryRebound with Apples Swift 3 beta 6在 Apples Swift 3 beta 6 中使用 withMemoryRebound
【发布时间】:2016-12-24 13:26:26
【问题描述】:

我有以下问题。我想转换我的旧函数(直到 Swift 3 beta 5):

func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T
{
    return value.withUnsafeBufferPointer
    {
        return UnsafePointer<T>($0.baseAddress!).pointee
    }
}

到 Swift 3 beta 6 语法。该函数将 UInt8 的数组转换为另一种类型,例如:

let b: [UInt8] = [1,2,3,4,5,6,7,8]
var number: Double = binarytotype(b, Double.self)

但是现在这在 beta 6 中不再起作用,我必须使用 withMemoryRebound 但我真的不知道如何让它运行。有人可以帮帮我吗?

它的反向功能是:

func typetobinary <T> (_ value: T) -> [UInt8]
{
    var v: T = value
    return withUnsafePointer(to: &v)
    {
        Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>($0), count: MemoryLayout<T>.size))
    }
}

这也不再起作用了。同样的问题。我的一些项目都需要两者。这个反向函数被称为:

var binary: [UInt8] = typetobinary(number)

【问题讨论】:

    标签: swift pointers type-conversion swift3 xcode8-beta6


    【解决方案1】:

    自 Xcode 8 beta 6 以来,指针转换现在更加“冗长”了。 这是一个可能的解决方案:

    func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T {
        return value.withUnsafeBufferPointer {
            UnsafeRawPointer($0.baseAddress!).load(as: T.self)
        }
    }
    
    func typetobinary<T>(_ value: T) -> [UInt8] {
        var data = [UInt8](repeating: 0, count: MemoryLayout<T>.size)
        data.withUnsafeMutableBufferPointer {
            UnsafeMutableRawPointer($0.baseAddress!).storeBytes(of: value, as: T.self)
        }
        return data
    }
    

    例子:

    let d = typetobinary(UInt16(1000))
    print(d) // [232, 3]
    let i = binarytotype(d, UInt16.self)
    print(i) // 1000
    

    请参阅SE-0107 UnsafeRawPointer API 有关新的原始指针 API 的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      相关资源
      最近更新 更多