2016-11-24 8 views
0

Momentan konvertiere ich den Hardware-Decodier-Obj-C-Code in die Swift-Version. (Xcode 8, Swift 3).Wie verwendet man CFDictionarySetValue in swift?

Ich weiß nicht, wie ich ein Wörterbuch einrichten, um eine Ausgabeoption auf dem Bildschirm einzurichten, auch, ich weiß nicht, wie man es benutzt.

Der folgende Code funktioniert in Obj-C-Projekt fein:

// set some values of the sample buffer's attachments 
CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, YES); 
CFMutableDictionaryRef dict = (CFMutableDictionaryRef)CFArrayGetValueAtIndex(attachments, 0); 
CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanTrue); 

ich folgende Swift Code versucht, aber es gab einen Laufzeitfehler:

// i got run-time error 
let attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer!, true) 
let dict = unsafeBitCast(attachments, to: CFMutableDictionary.self) 
CFDictionarySetValue(dict, unsafeBitCast(kCMSampleAttachmentKey_DisplayImmediately, to: UnsafeRawPointer.self), unsafeBitCast(kCFBooleanTrue, to: UnsafeRawPointer.self)) 

Ist es falsch, die CFString zu konvertieren zu UnsafeRawPointer? oder Ist es falsch die Methode CFDictionarySetValue zu verwenden?

Dies ist mein Fehlerprotokoll.

2016-11-24 16:50:44.458 MyApp[35288:3519253] -[__NSSingleObjectArrayI __setObject:forKey:]: unrecognized selector sent to instance 0x6000002045a0 
2016-11-24 16:50:44.466 MyApp[35288:3519253] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleObjectArrayI __setObject:forKey:]: unrecognized selector sent to instance 0x6000002045a0' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010b02734b __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x000000010a0e421e objc_exception_throw + 48 
    2 CoreFoundation      0x000000010b096f34 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132 
    3 CoreFoundation      0x000000010afacc15 ___forwarding___ + 1013 
    4 CoreFoundation      0x000000010afac798 _CF_forwarding_prep_0 + 120 
    5 MyApp        0x000000010937ac7a _TFC14MyApp16ViewerController21receivedRawVideoFramefT5frameGSaVs5UInt8_4withVs5Int32_T_ + 4890 
    6 MyApp        0x000000010937d8e2 _TFC14MyApp16ViewerController12MainCallBackfTVs5Int3212callbackCodeS1_8argumentGSqSv_7argSizeS1__T_ + 4242 
    7 MyApp        0x000000010937daed _TToFC14MyApp16ViewerController12MainCallBackfTVs5Int3212callbackCodeS1_8argumentGSqSv_7argSizeS1__T_ + 61 
    8 MyApp       0x000000010937dd56 _TTDFC14MyApp16ViewerController12MainCallBackfTVs5Int3212callbackCodeS1_8argumentGSqSv_7argSizeS1__T_ + 70 
    9 MyApp        0x000000010937dcfe _TTWC14MyApp16ViewerControllerS_18IJCallbackProtocolS_FS1_12MainCallBackfTVs5Int3212callbackCodeS2_8argumentGSqSv_7argSizeS2__T_ + 62 
    10 MyApp        0x00000001093b22b2 _TFC14MyApp11AppDelegate19MainCallBack_StreamfTVs5Int32S1_GSqSv_S1__T_ + 258 
    11 MyApp        0x00000001093d26d3 _TFZFC14MyApp19IJStreamCoreWrapper6AttachFTSv2ipSS4portSi_T_U_FTVs5Int32S1_GSqSv_S1_GSqSv__T_ + 355 
    12 MyApp        0x00000001093d2719 _TToFZFC14MyApp19IJStreamCoreWrapper6AttachFTSv2ipSS4portSi_T_U_FTVs5Int32S1_GSqSv_S1_GSqSv__T_ + 9 
    13 MyApp        0x00000001093ee176 _ZL8CallbackPN14CStreamManager9Session_TEiPvi + 70 
    14 MyApp        0x00000001093f09d3 _Z25StreamManagerThread_VideoPv + 3155 
    15 libsystem_pthread.dylib    0x000000010e494aab _pthread_body + 180 
    16 libsystem_pthread.dylib    0x000000010e4949f7 _pthread_body + 0 
    17 libsystem_pthread.dylib    0x000000010e494221 thread_start + 13 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

Anzeigen, was das Laufzeitfehlerprotokoll hilfreich sein kann. –

+0

Ich bin mir nicht sicher über die genaue Syntax, aber wenn ich mich richtig erinnere, sollte 'CFDictionary' zu 'NSDictionary' überbrückt werden ... Es muss eine einfache Lösung geben, die das swift-Schlüsselwort' as' beinhaltet. –

+1

es ist auch zu Swifts ursprünglichem 'Wörterbuch' überbrückt. Verwende das. – Alexander

Antwort

0

Im ersten Codeausschnitt, haben Sie einen Anruf zu CFArrayGetValueAtIndex, die ein Dictionary zurückgibt, die Sie CFDictionarySetValue passieren.

Im zweiten Code-Snippet rufen Sie nicht CFArrayGetValueAtIndex. Sie übergeben das Array einfach an CFDictionarySetValue. Da ein Array kein Wörterbuch ist, erhalten Sie einen schwerwiegenden Fehler.

+0

Dank dir fand ich einen Fehler und löste es. –

1

Wenn Sie Code in Swift konvertieren, ist es am besten, die Semantik des Programms zu verstehen und Swift-Code neu zu schreiben. Versuchen Sie nicht, die Syntax nur Stück für Stück zu konvertieren.

CMSampleBufferGetSampleAttachmentsArray gibt Ihnen eine Referenz auf CFArray von CFDictionary Instanzen zurück. Dies CFArrayRef zu CFMutableDictionaryRef Casting hat den Effekt, nur einen Verweis auf die erste Instanz zu machen.

Es ist am besten, nur Swift-Typen zu verwenden. Ich kann keine genaue Implementierung bereitstellen, da ich nicht sicher bin, welche Typen im Spiel sind, aber hier ist ein Anfang.

//TODO: give me a better name 
let array = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer!, true) as [[String: Bool]] //TODO: 

//TODO: give me a better name 
var firstDict = array[0] 

firstDict[kCMSampleAttachmentKey_DisplayImmediately as String] = true 
+0

Vielen Dank für Ihren Hinweis. Ich werde es versuchen. –

Verwandte Themen