ios - 当@objc 推理关闭时,Xcode 为框架生成的伞形 header 不会导入 Foundation

标签 ios swift xcode

我有一个完全用 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/

相关文章:

ios - subview 大小错误

python - PyObjC + Xcode 3.2 + 非 Apple Python

ios - ERROR ITMS-90432 : Invalid Swift Support. 有解决办法吗?

ios - UICollectionView 加载速度太慢

iOS - 使用设备摄像头识别 3D 对象

ios - 新的 Lister 应用程序错误 "The shared application group container is unavailable. Check your entitlements and provisioning profiles for this target..."

ios - 当我将照片从照片库保存到文档时,我读取它时它是空白的

ios - 如何在 UIDatePicker 中更改日期格式

ios - 拒绝 iOS 应用程序原因 : Data Storage Guidelines

ios - 显示键盘时 Phonegap 防止滚动