Использование "Availability.h" в файле Objective-C, импортированном через заголовок моста

Я пытаюсь использовать решение с открытым исходным кодом, которое опирается на Availability Макросы, файлы Objective-C, которые я добавил в свой проект Swift, импортируют необходимый заголовок:

#import "Availability.h"
(tried changing "" for <> as well)

Я понимаю, что это часть основы Фонда, которую я добавил в Linked Frameworks and Libraries раздел. Однако все строки кода, относящиеся к доступности, игнорируются, и в итоге Duplicate interface definition ошибки, в то время как предполагается, что это определения для конкретной платформы /iOS.

Я пытался добавить / удалить структуру, Cleaning/Cleaning build folder, согласно всем предложениям в этом вопросе и других, попытался перезапустить XCode - ничего не помогло.

Как использовать доступность в файлах Objective-C, импортированных в проект Swift с использованием заголовка Bridging?

Настройка: Xcode 7.3

1 ответ

Решение

Итак, у вас есть проект Swift, и вы добавили отсюда Apple "Availability.h".

Затем вы хотите использовать эти макросы в Objective-C или Swift. Это достаточно просто, но важно отметить, что вы не можете использовать макрос C в Swift напрямую. Вам понадобится обёртка объектива-C.

//  AvailableTester.h
#import <Foundation/Foundation.h>

@interface AvailableTester : NSObject
- (BOOL) testAvailabilityMacroLessThaniPhone3;
- (BOOL) testAvailabilityMacroGreaterThaniPhone3;
@end

и реализация:

//  AvailableTester.m

#import "AvailableTester.h"
#import "Availability.h"

@implementation AvailableTester

- (BOOL) testAvailabilityMacroLessThaniPhone3
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_3_0
    return YES;
#else
    return NO;
#endif
}

- (BOOL) testAvailabilityMacroGreaterThaniPhone3
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_3_0
    return YES;
#else
    return NO;
#endif
}

@end

Тогда в заголовке вашего моста:

#import "AvailableTester.h"

Теперь вы можете использовать его из Swift:

    let test = AvailableTester()
    var result = test.testAvailabilityMacroLessThaniPhone3()
    print("Result1 was \(result)")

    result = test.testAvailabilityMacroGreaterThaniPhone3()
    print("Result2 was \(result)")
Другие вопросы по тегам