如何将UnsafeMutablePointer<T?>
用作UnsafeMutablePointer<UnsafeRawPointer?>!
e.g。尝试为类型T分配n块内存,以获取CFSet cfsetref
:
var array = UnsafeMutableRawPointer<T?>.allocate(capacity: n)
CFSetGetValues(cfsetref, array) // error
哪个给出了错误
无法转换类型&#39;
UnsafeMutablePointer<T?>
&#39;的值预期 参数类型&#39;UnsafeMutablePointer<UnsafeRawPointer?>!
&#39;
我尝试将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
错误
答案 0 :(得分:3)
很多事情取决于您获取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
的内容?有了这些信息,我会试着告诉你在实际案例中需要编写什么样的代码。