Как соединить длинный длинный макрос 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 как Int64let постоянная.

Использование:

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

Мартин Р упоминает в комментариях, что попытка в вопросе работает на Xcode 8. В Xcode 7 вам нужно объявить функцию как static:

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

Это известная проблема со Swift и, будем надеяться, будет исправлена ​​в следующем выпуске.

  • SR-485

  • rdar://problem/20462344

Другие вопросы по тегам