EDIT
Ta odpowiedź została podana w trakcie okresu testowego Swift beta. Wydaje się, że obecnie rozwiązanie jest prostsze, jak sugeruje Klinger
var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
jednak zostawię poprzednią odpowiedź ze względów historycal :-)
poprzednią odpowiedź
spojrzeć na prerelease docs:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-XID_40
Konkretnie to oświadczenie
Remapped Types
When Swift imports Core Foundation types, the compiler remaps the names of these types. The compiler removes Ref from the end of each type name because all Swift classes are reference types, therefore the suffix is redundant.
The Core Foundation CFTypeRef type completely remaps to the AnyObject type. Wherever you would use CFTypeRef, you should now use AnyObject in your code.
Pierwszą rzeczą, którą chcesz zrobić, to usunąć "ref" z każdego rodzaju. Jednak nie jest to konieczne, ponieważ "refs" są z natury rzeczy typowe dla typów "non-ref".
Następnie to oświadczenie powinno zadziałać. To może potrzebować strojenie przed Nigdy nie pracowałem z CMSampleBufferGetImageBuffer
, i z tego powodu nie jestem pewien co do pierwszej linii (zainicjować bufor)
var buf : CMSampleBuffer = // initialize the buffer
var anUnmanaged : Unmanaged<CVImageBuffer> = CMSampleBufferGetImageBuffer(buf)
var returnValue = anUnmanaged.takeUnretainedValue()
Lub krótko
var buf : CMSampleBuffer = // initialize the buffer
var anUnmanaged : CVImageBuffer = CMSampleBufferGetImageBuffer(buf).takeRetainedValue()
jednak , poprosiłeś o CVPixelBuffer. Jeśli oba typy są w pełni kompatybilne (nie znam bazowego API, więc zakładam, że rzutowanie pomiędzy CVPixelBuffer i CVImageBuffer w objc jest zawsze bezpieczne), nie ma "automatyzmu", aby to zrobić, musisz przejść przez Unsafe Wskaźnik.
Kompletny kod jest następujący:
var buf : CMSampleBuffer = // initialize the buffer
var anUnmanaged : Unmanaged<CVImageBuffer> = CMSampleBufferGetImageBuffer(buf)
var returnValue = anUnmanaged.takeUnretainedValue()
var anOpaque = anUnmanaged.toOpaque()
var pixelBuffer : CVPixelBuffer = Unmanaged<CVPixelBuffer>.fromOpaque(anOpaque).takeUnretainedValue()
użyłem takeUnretainedValue(), która nie zużywa się liczyć zachować, ponieważ CMSampleBufferGetImageBuffer() zwraca niezatrzymany obiektowi
Dziękujemy! W cel-c CVImageBufferRef jest synonimem CVPixelBufferRef, więc to doprowadzało mnie do szału. – klinger
W tym przypadku proponuję złożyć wniosek o funkcję błędu, aby mieć automatyczną obsadę w przyszłym wydaniu :-) Nie wykluczam, że istnieje jakaś funkcja mostkowania między dwoma ukrytymi gdzieś typami, jednak przechodzącymi przez nieprzezroczyste wskaźnik to pierwsze rozwiązanie, które przyszło mi do głowy :-) – LombaX