【问题标题】:C++ and Swift Don't Like Each OtherC++ 和 Swift 互不喜欢
【发布时间】:2016-05-10 21:40:10
【问题描述】:

我正在尝试在 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 永远不会是真的,即使函数失败。我做错了什么?

【问题讨论】:

  • 也许你提到它是哪个库,有人会知道。
  • @JonathanPotter 我添加了库名称。

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


【解决方案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++ 检查句柄是否有效并返回一个整数 flag,Swift 应该很容易理解。
  2. 检查h.hashValue。如果为0,则句柄无效, 否则有效。这是一个糟糕的无证黑客,但它有 为我工作。我会远离这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2016-04-04
    • 2016-12-31
    相关资源
    最近更新 更多