在通过桥接头导入的 Objective-C 文件中使用“Availability.h”

Posted

技术标签:

【中文标题】在通过桥接头导入的 Objective-C 文件中使用“Availability.h”【英文标题】:Using "Availability.h" in Objective-C file imported through bridging header 【发布时间】:2016-08-15 18:01:22 【问题描述】:

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

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

我知道它是我在Linked Frameworks and Libraries 部分添加的 Foundation 框架的一部分。但是,所有特定于可用性的代码行都被忽略了,我最终会遇到Duplicate interface definition 错误,而这些应该是特定于平台/ios 版本的定义。

我已经尝试添加/删除框架 Cleaning/Cleaning build folder,按照 this question 和其他人中的所有建议,尝试重新启动 Xcode - 没有任何帮助。

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

设置:Xcode 7.3

【问题讨论】:

【参考方案1】:

所以你有一个 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)")

【讨论】:

感谢您的回复!不幸的是,这不是我想要的,我想在 Objective-C 中使用可用,而不是 Swift。而且我无法将它正确导入到我的 Objective-C 头文件中,它只是不起作用 你的项目中有它吗?它不是 Apple 框架的一部分——它是一个独立的文件。从链接下载它并将其拖到您的项目中。 我在这里有点困惑,看到一些帖子说它是 Foundation 框架的一部分。在我正在使用的项目中,该项目构建良好,但它是一个纯 Objective-C 项目,文件位于此处:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator。 sdk/usr/include/Availability.h 有一个标题搜索路径:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include 我尝试将它添加到我的项目中 - 不走运。复制可用性文件,尝试构建项目,将返回给您结果 好的,在本地添加文件解决了非功能可用性的问题,一般来说,你的答案对 Swift 用户来说是一个有用的答案,所以我会接受它作为一个正确的答案:) 我的代码仍然没有不过,我真的厌倦了试图让 Objective-C 与 Swift 一起正常工作,逻辑大不相同,我宁愿用 Swift 重写所有内容

以上是关于在通过桥接头导入的 Objective-C 文件中使用“Availability.h”的主要内容,如果未能解决你的问题,请参考以下文章

桥接头文件找不到导入的 Objective-C 项目

无法使用桥接头将 Objective-C 文件导入 Swift 项目

无法使用桥接头将 Objective-C 文件导入 Swift 项目

框架方法可访问性中的桥接头

Swift:导入桥接头失败

在桥接头中导入头文件导致的 Swift 编译器错误