如何将一个 long long C 宏桥接到 Swift?

How to bridge a long long C macro to Swift?

在 Foundation 中有一个 C 宏 NSURLResponseUnknownLength 定义为 long long:

#define NSURLResponseUnknownLength ((long long)-1)

由于宏桥接到 Swift 的方式,此常量可在 Objective-C 应用程序中访问,但不能在 Swift 应用程序中访问。如何让 Swift 可以看到这些宏?

我尝试在桥接中将宏包装在全局 C 函数中 header:

long long getNSURLResponseUnknownLength() {
    return NSURLResponseUnknownLength;
}

但是访问 getNSURLResponseUnknownLength() 会导致 Undefined symbols for architecture 构建错误。

解决方案是从宏中声明一个新的常量值:

const long long myNSURLResponseUnknownLength = NSURLResponseUnknownLength;

此桥接 NSURLResponseUnknownLength 作为 Int64 let 常量。

用法:

if urlResponse.expectedContentLength == myNSURLResponseUnknownLength {
    // ...
}

Martin R 提到 问题中的尝试适用于 Xcode 8。在 Xcode 7 中,您需要将函数声明为 static

static long long getNSURLResponseUnknownLength() { /* */ }

这是 Swift 的一个已知问题,有望在即将发布的版本中得到修复。

  • SR-485

  • rdar://problem/20462344