我正在构建一个Mac OS X应用程序(二进制)。Skit是Swift框架,Pal是包含.m文件的应用程序。编译器无法找到NSArray或NSDictionary,这意味着编译器无法找到Foundation模块。如果我转到Pal Swift.h中的错误(它是生成的),并手动添加@import Foundation或@import Cocoa,二进制文件编译得很好,我可以像预期的那样从objc使用框架中的类,并且我通常可以不断迭代,直到我需要做一个干净的构建。
错误如下所示。
While building module 'SKit' imported from /Users/mtozer/Library/Developer/Xcode/DerivedData/Pal-dznqzplhixgqpgduvvxjqiknvhrr/Build/Intermediates/Pal.build/Debug/Pal.build/DerivedSources/Pal-Swift.h:90:
In file included from <module-includes>:1:
/Users/mtozer/Library/Developer/Xcode/DerivedData/Pal-dznqzplhixgqpgduvvxjqiknvhrr/Build/Products/Debug/SPluginKit.framework/Headers/SKit-Swift.h:97:26: error: expected a type
- (void)executeCommands:(NSArray * __nonnull)commands;
^
/Users/mtozer/Library/Developer/Xcode/DerivedData/Pal-dznqzplhixgqpgduvvxjqiknvhrr/Build/Products/Debug/SKit.framework/Headers/SKit-Swift.h:115:4: error: expected a type
+ (NSDictionary<NSString *, id <SPlugin>> * __nonnull)loadPluginsInDirectory:(NSString * __nonnull)directory sAPI:(id <SAPI> __nonnull)sAPI;
^
2 errors generated.
In file included from /Users/mtozer/Pal/Pal/AppDelegate.m:43:
/Users/mtozer/Library/Developer/Xcode/DerivedData/Pal-dznqzplhixgqpgduvvxjqiknvhrr/Build/Intermediates/Pal.build/Debug/Pal.build/DerivedSources/Pal-Swift.h:90:9: fatal error: could not build module 'SKit'
@import SKit;
~~~~~~~^~~~~~~~~~~~~~~~~~
3 errors generated.
我确信这是一个编译器错误,但我使用的是BUCK,它不正式支持swift。
简单地在我的框架的源代码中放一个空的扩展导致生成器将基础依赖项正确地放在头中
extension NSArray {
}
记得在Swift中为类和协议声明添加@objc。
@objc public class YourClassName: NSObject { ... }
@objc public protocol YourProtocolName { ... }
如果问题仍然存在,请尝试在协议的末尾添加: class
,因为Swift协议不仅可以像Objc中那样由类实现。
@objc public protocol YourProtocolName: class { ... }