2016-05-10 3 views
1

SwiftでMP4v2という名前のC++ライブラリを使用しようとしています。私はいくつかの関数を呼び出すことができ、いくつかのクラスを使うことができます。C++とSwiftはお互いが好きではない

voidポインターを返す特定の関数に問題があります。失敗した場合はNULL、成功した場合はその他の値です。チェックには定数が定義されていますが、無関係でないことをチェックすることはありません。

if file != MP4_INVALID_FILE_HANDLE { 

/<path_to_project>/main.swift:19:12: Use of unresolved identifier 'MP4_INVALID_FILE_HANDLE'をスローするが、それはありませんが、(他の定数が動作)が存在します。

if file != NULLは、同じ問題を引き起こすだけで、機能が失敗した場合でもif file != nilは真ではありません。私は間違って何をしていますか? MP4v2のドキュメントを見てみると

+0

おそらくあなたがそれがどのライブラリであるかを言えば、誰かが知っているだろう。 –

+0

@ JonathanPotterライブラリ名を追加しました。 – Coder256

答えて

1

、ここではマクロの定義が無効なハンドルをチェックすることです:それはNULLを含むので、それはスウィフトで使用することはできません

#define MP4_INVALID_FILE_HANDLE ((MP4FileHandle)NULL) 

理由があります。実際には、あなたはあなたのObjective-C(++)コードで

#define MY_NULL NULL 

のようなものを定義し、スウィフトは、あなたの代わりにnilを使用することをお勧めしますスウィフトでそれを使用しよう。

ハンドルタイプMP4FileHandleはあなたが

MP4FileHandle aCPPFunction() 

のような関数を呼び出している場合は、スウィフトに次のように戻り値をチェックすることができるはず、だから、

typedef void * MP4FileHandle 

です:

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 
} 

これを試したことが分かりました。うまくいくはずです。再確認してください。どんな奇妙な理由で、これはあなたのために動作しない場合は、他のいくつかのオプションがあります。

  1. は、ハンドルが有効であるかどうかを確認するためにC、C++、Objective-Cのか のObjective-C++で簡単なヘルパー関数を書きますSwiftによって容易に理解されるべきである整数 フラグを返します。
  2. チェックh.hashValue。 0の場合、ハンドルは無効です。そうでない場合は が有効です。これは不正な文書化されていないハックですが、それは が私のために働いています。私はこの1つから離れています。
関連する問題