我有一个完全用 Swift 编写的框架,它包含在一个混合使用 Objective-C 和 Swift 的应用程序中,即
#import "MyFramework-Swift.h"
如果 Swift 3 @objc inference
为框架目标打开 ON
,那么一切都会编译并运行良好。如果 Swift 3 @objc inference
OFF
则框架本身将编译,但它包含的文件不会编译并吐出一堆错误,如:
Unknown type name 'NSArray'
或 Unknown type name 'NSError'
我尝试使用此框架的 Objective-C 文件中的导入基本上如下所示(即在尝试导入 swift 框架之前导入 Foundation ):
@import Foundation;
#import <OtherNonSystemHeaders.h>
#import "ThisFilesHeader.h"
#import "MyFramework-Swift.h"
如果我打开 Xcode 生成的头文件,有一个大约 150 行的部分如下所示:
#if __has_feature(modules)
@import ObjectiveC;
#endif
如果我手动将其更改为此,它将编译并运行。
#if __has_feature(modules)
@import ObjectiveC;
@import Foundation;
#endif
显然这不是一个真正的解决方案,因为它会在 Xcode 重新生成该 header 时被覆盖,但我不明白为什么关闭 @objc 推断会导致该导入消失。我已经手动将某些方法标记为@objc,框架子类NSObject中的所有类,并且每个文件都导入了Foundation。
我认为这可能是一个错误,但 Xcode 9.2 和 9.3 都会发生这种情况,显然人们可以关闭 @objc 推断,因为它现在是推荐设置。但是我真的很茫然。
最佳答案
这听起来像是您在 ObjC 之前缺少 @import Foundation;
:
#import "MyFramework-Swift.h"
ObjC 文件应该@import Foundation;
本身。出于性能原因,这通常也放在预编译头文件 (.pch) 中,但每个 .m
仍应导入它需要的所有内容,包括 Foundation。
通常我为 .m
文件推荐以下布局:
@import ...System Headers...
#import "Non-system framework headers"
#import "Local headers"
#import "Project-Swift.h"
关于ios - 当@objc 推理关闭时,Xcode 为框架生成的伞形 header 不会导入 Foundation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48955224/