如何使用 UnsafeMutablePointer<T?>
作为UnsafeMutablePointer<UnsafeRawPointer?>!
例如尝试为类型 T 分配 n 个内存块,以从 CFSet cfsetref
中获取值:
var array = UnsafeMutableRawPointer<T?>.allocate(capacity: n)
CFSetGetValues(cfsetref, array) // error
哪个给出了错误
Cannot convert value of type '
UnsafeMutablePointer<T?>
' to expected argument type 'UnsafeMutablePointer<UnsafeRawPointer?>!
'
我尝试声明 array
作为UnsafeMutablePointer<UnsafeRawPointer?>
然后做
for i in 0..<n {
var d = array[i]
d?.bindMemory(to: T.self, capacity: 1)
}
但我仍然得到 EXC_BAD_INSTRUCTION
尝试访问时出错 array[i]
(再次将内存绑定(bind)到 T
后)
最佳答案
很多事情取决于您如何获得 cfsetref
什么是T
.
但无论如何,CFSetGetValues
期待 UnsafeMutablePointer<UnsafeRawPointer?>!
如错误消息所示。
let n = CFSetGetCount(cfsetref)
let array = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: n)
array.initialize(to: nil, count: n)
CFSetGetValues(cfsetref, array)
安全访问 array
的内容, 你需要知道如何 T
由 Swift ARC 管理。例如,假设 T
是NSNumber
,你需要告诉 Swift ARC 通过编写如下内容来管理结果:
let managedArray = UnsafeMutableBufferPointer(start: array, count: n).map{Unmanaged<NSNumber>.fromOpaque($0!).takeRetainedValue()}
print(managedArray)
但与其他 CF 集合类型一样,处理 CFSet
的更好方法正在将其桥接到 Swift Set
:
if let swiftSet = cfsetref as? Set<NSNumber> {
let swiftArray = Array(swiftSet)
print(swiftArray)
}
你如何获得你的 cfsetref
什么是T
?有了这些信息,我会尝试告诉您在实际情况下需要编写什么样的代码。
关于arrays - Swift 分配指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48004786/