即使设置了解决方案,也无法在更新 Swift 后使用 withMemoryRebound

Posted

技术标签:

【中文标题】即使设置了解决方案,也无法在更新 Swift 后使用 withMemoryRebound【英文标题】:Unable to use withMemoryRebound after updating Swift even with solution set 【发布时间】:2016-11-14 19:35:22 【问题描述】:

我这里有这段代码,可以在预先存在的 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 相关。

【问题讨论】:

伙计,那是一行令人费解的长代码,哈哈 这可能就是你要找的东西:***.com/a/39004383/1187415. 【参考方案1】:

我想知道制作一个 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))

【讨论】:

用数组试过了,但它仍然说使用了未解析的标识符。我确定该声明有一些简单的解决方案?我不知道为什么我会得到那个。 它仍然说使用未解析的标识符到什么标识符?请显示您的 Xcode 版本和内部版本号。我的代码实际上是在 Xcode 8.1 (8B62) 上测试的。【参考方案2】:

试试这个:

func toByteArray<T>(_ value: T) -> Any 
    var value = value

    let pointerToT = withUnsafePointer(to: &value)  UnsafeRawPointer($0) 
    let sizeOfT = MemoryLayout<T>.size

    let pointerToBytes = pointerToT.bindMemory(to: UInt8.self, capacity: sizeOfT)
    let bytes = Array(UnsafeBufferPointer(start: bytePointer, count: sizeOfT))

    return bytes

【讨论】:

以上是关于即使设置了解决方案,也无法在更新 Swift 后使用 withMemoryRebound的主要内容,如果未能解决你的问题,请参考以下文章

即使在启用 Javascript 后 WKWebView 也无法正常工作 - Swift

即使应用程序在后台运行,如何使用 swift 在 ios 中获取位置更新

即使更新了各自的变量,也无法在 Flutter 中更新上下文

Swift:命令中心不起作用,即使我明确设置按钮启用?

即使在更新 SHA 1 指纹以获取发布密钥后,Google 地图也无法在 Play 商店中发布后加载

即使将其类别设置为播放(Swift),音频会话也会与其他会话混合?