即使设置了解决方案,也无法在更新 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 中更新上下文