2016-05-10 7 views
1

Ich versuche, in Swift eine C++ - Bibliothek namens MP4v2 zu verwenden. Es funktioniert meistens darin, dass ich einige Funktionen aufrufen kann, einige Klassen usw. verwenden kann.C++ und Swift mögen einander nicht

Ich habe Probleme mit einer bestimmten Funktion, die einen ungültigen Zeiger zurückgibt. Es ist NULL bei Ausfall oder ein anderer Wert auf Erfolg. Es gibt eine Konstante, mit der überprüft werden soll, aber weder das noch die Überprüfung auf Null funktioniert.

if file != MP4_INVALID_FILE_HANDLE { 

wirft /<path_to_project>/main.swift:19:12: Use of unresolved identifier 'MP4_INVALID_FILE_HANDLE', aber es ist nicht vorhanden (andere Konstanten arbeiten).

if file != NULL verursacht nur das gleiche Problem, und if file != nil ist nie wahr, auch wenn die Funktion fehlgeschlagen ist. Was mache ich falsch?

+0

Vielleicht wenn Sie erwähnen, welche Bibliothek es ist, wird jemand wissen. –

+0

@ JonathanPotter Ich habe den Namen der Bibliothek hinzugefügt. – Coder256

Antwort

1

Mit Blick auf MP4v2 Dokumentation, hier ist die Definition des Makros für ungültig Griff zu überprüfen:

#define MP4_INVALID_FILE_HANDLE ((MP4FileHandle)NULL) 

Der Grund kann es nicht in Swift verwendet werden, weil es ein NULL beinhaltet. In der Tat, definieren, wenn Sie so etwas wie

#define MY_NULL NULL 

in Ihrem Objective-C (++) Code und versuchen Sie es in Swift zu verwenden, wird Swift vorschlagen, dass Sie nil stattdessen verwenden.

Der Griff Typ MP4FileHandle ist

typedef void * MP4FileHandle 

Also, wenn Sie eine Funktion wie

MP4FileHandle aCPPFunction() 

Aufruf sollten Sie in der Lage sein, den Rückgabewert zu überprüfen, wie in Swift folgt:

let h : MP4FileHandle = aCPPFunction() 

if h != nil 
{ 
    // The handle is valid and can be given as an argument to 
    // other library functions. 
} 
else 
{ 
    // The handle is NULL 
} 

Ich verstehe, dass Sie das versucht haben. Es sollte funktionieren, bitte überprüfen Sie es. Wenn aus irgendeinem seltsamen Grund, dies nicht für Sie arbeiten, gibt es einige andere Optionen:

  1. eine einfache Hilfsfunktion schreiben in C, C++, Objective-C oder Objective-C++ zu überprüfen, ob das Handle gültig und gibt eine ganze Zahl zurück, die von Swift leicht verstanden werden sollte.
  2. Überprüfen Sie h.hashValue. Wenn es 0 ist, ist das Handle ungültig, andernfalls ist es gültig. Dies ist ein schlechter undokumentierter Hack, aber es hat für mich gearbeitet. Ich würde mich von diesem hier fernhalten.
Verwandte Themen