Может ли кто-нибудь пролить свет на то, как вызывать CFBinaryHeapGetValues в структуре данных Core Foundation CFBinaryHeap в Swift? Пример/пример кода мне бы очень помог. Это код, который у меня есть сейчас:
public class CountedColor : NSObject
{
public private(set) var count: Int
public private(set) var color: UIColor
public init(color: UIColor, colorCount: Int)
{
self.count = colorCount
self.color = color
super.init()
}
}
var callbacks = CFBinaryHeapCallBacks()
callbacks.compare = { (a,b,unused) in
let afoo : CountedColor = (a?.assumingMemoryBound(to: CountedColor.self).pointee)!
let bfoo : CountedColor = (b?.assumingMemoryBound(to: CountedColor.self).pointee)!
if ( afoo.count == bfoo.count ) { return CFComparisonResult.compareEqualTo }
if ( afoo.count > bfoo.count ) { return CFComparisonResult.compareGreaterThan }
return CFComparisonResult.compareLessThan
}
let callbackPointer = UnsafeMutablePointer<CFBinaryHeapCallBacks>.allocate(capacity: 1)
callbackPointer.initialize(to: callbacks)
var bh = CFBinaryHeapCreate(nil, 0, callbackPointer, nil)
var fooPointer : UnsafeMutablePointer<CountedColor>!
fooPointer = UnsafeMutablePointer<CountedColor>.allocate(capacity: 1)
fooPointer.initialize(to: CountedColor(color: UIColor.blue, colorCount: 72))
CFBinaryHeapAddValue(bh, fooPointer)
fooPointer = UnsafeMutablePointer<CountedColor>.allocate(capacity: 1)
fooPointer.initialize(to: CountedColor(color: UIColor.red, colorCount: 99))
CFBinaryHeapAddValue(bh, fooPointer)
var elements = [CountedColor](repeating: CountedColor(color: UIColor.white, colorCount: 0), count: 2)
var elementPtr = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1)
elementPtr.initialize(to: elements)
CFBinaryHeapGetValues(bh, elementPtr)
var returnedValues: UnsafePointer<[CountedColor]> = (elementPtr.pointee?.assumingMemoryBound(to: [CountedColor].self))!
print(elementPtr.pointee?.assumingMemoryBound(to: CountedColor.self).pointee.count)
print(elementPtr.pointee?.assumingMemoryBound(to: CountedColor.self).pointee.color)
let values = returnedValues.pointee
^^Если вы посмотрите выше на последние три строки, код не работает в последней строке, где я получаю EXC_BAD_ACCESS. Я смущен, почему, потому что два приведенных выше оператора печати действительно работают. Я могу убедиться, что первый объект в массиве C, возвращаемый функцией, действительно имеет меньший цвет со значением 72. Таким образом, это означает, что массив, который я передаю, обновляется значениями, однако, когда я пытаюсь получить дескриптор на массиве при доступе к указателю все идет наперекосяк. Сначала я подумал, что это связано с управлением памятью, но после прочтения того, как работает мост в Swift, я не уверен, что это так, тем более что это аннотированный API CoreFoundation.