如何将一个 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 的一个已知问题,有望在即将发布的版本中得到修复。
rdar://problem/20462344
在 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 提到 static
:
static long long getNSURLResponseUnknownLength() { /* */ }
这是 Swift 的一个已知问题,有望在即将发布的版本中得到修复。
rdar://problem/20462344