C++ 和 Swift 彼此不喜欢

C++ and Swift Don't Like Each Other

我正在尝试在 Swift 中使用名为 MP4v2 的 C++ 库。它主要是因为我可以调用一些函数,使用一些 类,等等

我在使用 returns 空指针的特定函数时遇到问题。失败时为 NULL,成功时为其他值。定义了一个要检查的常量,但它和检查 nil 都不起作用。

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 文档,这里是检查无效句柄的宏定义:

 #define    MP4_INVALID_FILE_HANDLE   ((MP4FileHandle)NULL)

不能在Swift中使用的原因是因为它涉及一个NULL。事实上,如果你定义类似

#define MY_NULL NULL

在你的Objective-C(++)代码中尝试在Swift中使用它,Swift会建议你改用nil

句柄类型MP4FileHandle

typedef void *  MP4FileHandle

因此,如果您调用的函数类似于

MP4FileHandle aCPPFunction()

您应该能够在 Swift 中检查 return 值,如下所示:

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++ 检查句柄是否有效和 return 整数 标志,Swift.
  2. 应该很容易理解
  3. 勾选h.hashValue。如果为0,则句柄无效, 否则它是有效的。这是一个糟糕的未记录的 hack,但它有 为我工作。我会远离这个。