Как соединить длинный длинный макрос C со Swift?
В фундаменте есть макрос C NSURLResponseUnknownLength
определяется как long long
:
#define NSURLResponseUnknownLength ((long long)-1)
Благодаря тому, что макросы соединяются со Swift, эта константа доступна в приложении Objective-C, но не в приложении Swift. Как я могу сделать такие макросы видимыми для Swift?
Я попытался обернуть макрос в глобальную функцию C в заголовке моста:
long long getNSURLResponseUnknownLength() {
return NSURLResponseUnknownLength;
}
Но доступ getNSURLResponseUnknownLength()
вызывает Undefined symbols for architecture
ошибка сборки.
1 ответ
Решение состоит в том, чтобы объявить новое постоянное значение из макроса:
const long long myNSURLResponseUnknownLength = NSURLResponseUnknownLength;
Это мосты NSURLResponseUnknownLength
как Int64
let
постоянная.
Использование:
if urlResponse.expectedContentLength == myNSURLResponseUnknownLength {
// ...
}
Мартин Р упоминает в комментариях, что попытка в вопросе работает на Xcode 8. В Xcode 7 вам нужно объявить функцию как static
:
static long long getNSURLResponseUnknownLength() { /* */ }
Это известная проблема со Swift и, будем надеяться, будет исправлена в следующем выпуске.
rdar://problem/20462344