C ++和Swift不喜欢彼此

时间:2016-05-10 21:40:10

标签: c++ objective-c swift c-preprocessor constants

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

我遇到了一个返回void指针的特定函数的问题。失败时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永远不会成立,即使函数失败也是如此。我做错了什么?

1 个答案:

答案 0 :(得分:1)

查看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中检查返回值:

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,则句柄无效, 否则它是有效的。这是一个糟糕的无证件黑客,但它有 为我工作。我会远离这一个。