Ответ 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
.
Я пытаюсь использовать стороннюю библиотеку 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
?
Я решил это, заменив
#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
.
Что я сделал, так это создать метод класса, который возвращает #define.
Пример:
.h файл:
#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;
.m файл:
+ (CGSize)adSize { return AD_SIZE; }
И в Swift:
Так как это метод класса, вы можете использовать его почти так же, как и #define. Если вы измените свой #define макрос - он будет отражен в новом методе, который вы создали В Swift:
let size = YourClass.adSize()
напишите свои константы после объявления класса. как это...
class ForgotPasswrdViewController: UIViewController {
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
let Tag_iamTxtf = 101