在通过桥接 header 导入的 Objective-C 文件中使用 "Availability.h"

Using "Availability.h" in Objective-C file imported through bridging header

我正在尝试使用依赖于 Availability 宏的开源解决方案,我添加到 Swift 项目的 Objective-C 文件导入必要的 header:

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

我知道它是 Foundation 框架的一部分,我在 Linked Frameworks and Libraries 部分添加了它。但是,所有 Availability-specific 行代码都被忽略了,我最终遇到了 Duplicate interface definition 错误,而这些应该是 platform/iOS version-specific 定义。

我已经尝试 adding/removing 框架,Cleaning/Cleaning build folder,根据 this question 和其他人的所有建议,尝试重新启动 Xcode - 没有任何帮助。

如何在使用桥接 header 导入到 Swift 项目的 Objective-C 文件中使用可用性?

设置:Xcode7.3

所以你有一个 Swift 项目,你添加了 Apple "Availability.h" from here.

然后您想要在 Objective-C 或 Swift 中使用这些宏。这很简单,但重要的是要注意您不能直接在 Swift 中使用 C 宏。您将需要一个 objective-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)")