누구나 Swift에서 Core Foundation의 CFBinaryHeap 데이터 구조에 CFBinaryHeapGetValues를 호출하는 방법에 대해 설명해 줄 수 있습니까? 코드 샘플/예제는 많은 도움이 될 것입니다. 당신이 코드는 내가 EXC_BAD_ACCESS를 얻을 마지막 줄에 실패 마지막 세 줄에 위에서 보면CFBinaryHeapGetValues ()를 올바르게 호출하고 Swift에서 결과 C 배열을 구문 분석하는 방법은 무엇입니까?
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
^^ : 이것은 내가 현재 가지고있는 코드입니다. 위의 두 인쇄 문이 실제로 작동하기 때문에 나는 왜 혼란스러워합니다. 함수에 의해 반환 된 C 배열의 첫 번째 개체가 참으로 카운트가 72 인 작은 색상인지 확인할 수 있습니다. 따라서 전달할 배열은 값으로 업데이트되지만 핸들을 얻으려고하면 pointee에 액세스하여 배열에 건초는 간다. 처음에는 이것이 메모리 관리 일이라고 생각했지만, Swift에서 브리징이 어떻게 작동 하는지를 읽은 후에, 특히 이것이 Annotated CoreFoundation API이므로 이것이 확실하지 않은지 잘 모르겠습니다. 코드에서
당신은 코드를 개선하기 위해 스위프트 표준 라이브러리에서 몇 가지 유용한 유형을 찾을 수 있지만, 한 번에 너무 많은 일을 배울 수있는 좋은 습관이 될 수 없습니다 ..., 감사합니다 너무 많이! 나는이 점을 훨씬 잘 이해한다. 빠른 후속 질문입니다. 당신이 작성한 코드의 마지막 줄에서, 그 함수는 어떻게 작동합니까? 내가 아는 바로는 무효 포인터이다. 그런 다음 Swift는 어떻게 원시 바이트를 읽고 CountedColor 객체를 만드는지를 알 수 있습니다. 설명서를 읽었지만 여전히 도움이되지 않았습니다. 이것은 솔직히 objC, C++ 및 C 세계에서 나오는 마법과 같아 보입니다. C와의 신속한 상호 운용은 일반적으로 나에게 마술처럼 보입니다. ( – AyBayBay
@AyBayBay, _how는 함수 작업으로로드를 수행합니까? _'(* SomeType *) aVoidPointer '와 같이 C에서 일부 내용을 검색 할 때'void *'를 적절한 유형으로 캐스팅합니다. Swift에서 'aVoidPointer.load (as : SomeType.self)'는 이에 상응합니다 아니면'aVoidPointer.assumingMemoryBound (to : SomeType.self) .pointee'의 바로 가기 형태라고 생각할 수 있습니다. – OOPer
대단히 감사합니다. :) 마지막으로 질문을 하나 더 드리겠습니다. 필요한 객체를 검토하고 싶습니다. 할당 취소/무료. 내가 callbackPtr, 모든 UnsafeMutablePointer 개체를 내가 BinaryHeap에 추가하고 마지막으로 elementPtr과 그 안에있는 개체를 상상할 것이라고 생각합니다. 여기 내 이해가 맞습니까? –
AyBayBay