ios - 即使使用解决方案集更新 Swift 后也无法使用 withMemoryRebound

标签 ios swift xcode swift3

我这里有这段代码,可以在预先存在的 swift 中运行。

func toByteArray<T>(_ value: T) -> [UInt8] {
    var val = value
    //let sock = socket(PF_INET, SOCK_STREAM, 0) // added in 11/16
    return withUnsafePointer(to: &val) {
        Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>($0), count: MemoryLayout<T>.size))
    }
}

这不起作用,因为它会打印一条错误消息,指出 init 不可用。使用 withMemoryRebound(to:capacity:_)。好的,所以我通过谷歌进行了研究并找到了一些应该有效的选项,现在我更新的代码是

 func toByteArray<T>(_ value: T) -> [UInt8] {
    var val = value
    return withUnsafePointer(to: &val) {
        //another swift 3 change with UnsafePointer<UInt8>
        Array(UnsafeBufferPointer(start: ($0).withMemoryRebound(to:UInt8.self, capacity: 1){ SCNetworkReachabilityCreateWithAddress(nil, $0)}, count: MemoryLayout<T>.size))
    }

}

这应该有效,但它说使用未解析的标识符 SCNetworkReachabilityCreateWithAddress,我不明白,也找不到解决方案。关于问题是什么的任何想法?我觉得这是更新后的 Swift 和 Xcode 的一部分。

最佳答案

我想知道制作一个 UInt8 数组是否是满足您实际目的的最佳解决方案。

例如,Data 在 Swift 3 中作为 UInt8 的集合。

func toData<T>(_ value: T) -> Data {
    var val = value
    return Data(bytes: &val, count: MemoryLayout<T>.size)
}
for byte in toData(i) {
    print(String(format: "%02X", byte))
}
/* output:
 78
 56
 34
 12
 00
 00
 00
 00
 */

但如果你坚持使用 Array,你可以使用 UnsafeRawBufferPointer(自 Swift 3.0.1/Xcode 8.1 起可用)编写如下内容:

func toByteArray<T>(_ value: T) -> [UInt8] {
    var val = value
    return Array(UnsafeRawBufferPointer(start: &val, count: MemoryLayout<T>.size))
}

关于ios - 即使使用解决方案集更新 Swift 后也无法使用 withMemoryRebound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40596478/

相关文章:

ios - 如何更改平板电脑上的 labelCount? (当有更多空间可用时)

iphone - 插入读卡器后,AudioServicesPlaySystemSound 在 iPhone 中无法正常工作

javascript - React Native Debugger 状态未定义

ios - 快速的本地通知声音不起作用

cocoa-touch - iOS 获取类似 ActionSheet 的按钮

ios - 如何向 Bar Button Item 添加有关按钮用途的提示?

ios - 从 Firebase 获取数据的最有效方式

xcode - Swift 中的自定义对象类

ios - 防止在越狱设备中安装 iOS 应用程序

iphone - 显示 plist 中的随机问题