【问题标题】:Swift framework imported into Objc-C binary does not generate Obj-c header correctly, missed @import Cocoa;导入 Objc-C 二进制文件的 Swift 框架未正确生成 Obj-c 标头,错过了 @import Cocoa;
【发布时间】:2016-04-13 19:26:08
【问题描述】:

我正在构建一个 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.

【问题讨论】:

    标签: objective-c swift macos cocoa compiler-errors


    【解决方案1】:

    我相当确信这是一个编译器错误,但我再次使用不正式支持 swift 的 BUCK。

    只需在我的框架源代码中放置一个空扩展,就会导致生成器将基础依赖项正确放置在标题中

    extension NSArray {
    
    }
    

    【讨论】:

    • 我没有使用(并且不熟悉 BUCK),但我随机遇到了同样的问题。不知道你是怎么想出来的,但是谢谢!
    【解决方案2】:

    记得在 Swift 中的类和协议声明前加上 @objc。

    @objc public class YourClassName: NSObject { ... }
    
    @objc public protocol YourProtocolName { ... }
    

    如果问题仍然存在,请尝试在协议末尾附加 : class,因为 Swift 协议不仅可以像 Objc 中那样由类实现。

    @objc public protocol YourProtocolName: class { ... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      相关资源
      最近更新 更多