我如何使用UnsafeMutablePointer<T?>
作为UnsafeMutablePointer<UnsafeRawPointer?>!
例如尝试为类型T分配n块内存,以从CFSet cfsetref
获取值:
var array = UnsafeMutableRawPointer<T?>.allocate(capacity: n)
CFSetGetValues(cfsetref, array) // error
这给出了错误
无法将'
UnsafeMutablePointer<T?>
'类型的值转换为预期参数类型'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]
之后)仍然会出现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
的内容,您需要知道如何通过Swift ARC管理T
。例如,假设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
究竟是什么?有了这些信息,我会试着告诉你在实际案例中需要编写什么样的代码。