swift - 在 Apples Swift 3 beta 6 中使用 withMemoryRebound

标签 swift pointers type-conversion swift3 xcode8-beta6

我有以下问题。我想转换我的旧函数(一直工作到 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)

最佳答案

自 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 的详细信息。

关于swift - 在 Apples Swift 3 beta 6 中使用 withMemoryRebound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39004231/

相关文章:

ios - 什么是 CGFloat.random(min : CGFloat, max : CGFloat) of swift 2 in swift 3?

c - 尝试填充动态数组时出现访问冲突(大量项目)

c - 为什么 str[5]、str[] = "1234"和 str = malloc(5) 有不同的大小?

c - 字符串和指针的问题

Java方法调用转换

c# - 为什么动态转换会抛出异常?

ios - 如何在表头中不实现 SearchBar

iOS - 解析当前用户提取不工作

ios - 从已在使用的 segue 的先前 VC 传回数据

algorithm - 在精度损失后从 int 中恢复 long