Подтвердить что ты не робот

Как использовать код Objective-C с макросами #define в Swift

Я пытаюсь использовать стороннюю библиотеку Objective-C в моем проекте Swift. У меня есть библиотека, успешно импортированная в Xcode, и я создал файл <Project>-Bridging-Header.h, который позволяет мне использовать классы Objective-C в Swift.

Кажется, что я столкнулся с одной проблемой: код Objective-C содержит файл Constants.h с макросом #define AD_SIZE CGSizeMake(320, 50). Импорт Constants.h в мой <Project>-Bridging-Header.h не приводит к глобальной константе AD_SIZE, которую может использовать мое приложение Swift.

Я провел некоторое исследование и увидел, что документация Apple здесь в разделе "Комплексные макросы" говорит, что

"В Swift вы можете использовать функции и дженерики для достижения того же результаты [как сложные макросы] без каких-либо компромиссов. Следовательно сложные макросы, которые находятся в C и Objective-C исходных файлах не созданы доступный для вашего кода Swift."

После прочтения этого, я получил его, чтобы он работал нормально, указав let AD_SIZE = CGSizeMake(320, 50) в Swift, но я хочу поддерживать будущую совместимость с библиотекой в ​​случае изменения этих значений без меня.

Есть ли легкое исправление для этого в Swift или мой заголовок? Если нет, есть ли способ заменить #define AD_SIZE CGSizeMake(320, 50) в Constants.h и сохранить что-то обратно совместимым с любыми существующими приложениями Objective-C, которые используют старый макрос AD_SIZE?

4b9b3361

Ответ 1

Я решил это, заменив

#define AD_SIZE CGSizeMake(320, 50)

в библиотеке Constants.h с помощью

extern CGSize const AD_SIZE;

и добавив

CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };

в библиотеке Constants.m.

Ответ 2

Что я сделал, так это создать метод класса, который возвращает #define.

Пример:

.h файл:

#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;

.m файл:

+ (CGSize)adSize { return AD_SIZE; }

И в Swift:

Так как это метод класса, вы можете использовать его почти так же, как и #define. Если вы измените свой #define макрос - он будет отражен в новом методе, который вы создали В Swift:

let size = YourClass.adSize()

Ответ 3

напишите свои константы после объявления класса. как это...

class ForgotPasswrdViewController: UIViewController {
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
let Tag_iamTxtf = 101