是否可以在Objective-C中调用Swift便捷初始化程序

squ*_*rog 5 objective-c swift

假设我在Swift中有一个方便的初始化程序:

extension UIImage {
    convenience init?(bundleNamed name: String) {
        let bundle = NSBundle(forClass: Foo.self)
        self.init(named: name, inBundle: bundle, compatibleWithTraitCollection: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能在Objective-C中调用它?以下不起作用:

[UIImage bundleNamed:@"Bar"];
[[UIImage alloc] initWithBundleNamed:@"Bar"];
Run Code Online (Sandbox Code Playgroud)

我是否只需要为Objective-C提供额外的类扩展?


解决方案:按照Lasse的回答,我必须做的步骤是:

在Objective-C类实现文件中,添加

#import <ModuleName-Swift.h>
Run Code Online (Sandbox Code Playgroud)

然后我不得不删除派生数据并重建.然后我能够使用便利初始化程序如下:

[[UIImage alloc] initWithBundleNamed: @"Bar"];
Run Code Online (Sandbox Code Playgroud)

我不需要声明初始化程序,public因为默认级别internal足以支持我的模块.

Las*_*sse 7

查看使用Swift与Cocoa和Objective-C(Swift 2.2) - 混合和匹配.它似乎归结为

  1. 为您提供方便的初始化程序public,以及
  2. 将XCode生成的头文件[YourProductModuleName]-Swift.h导入代码中