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