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

时间:2016-04-12 10:28:22

标签: 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)
    }
}

我如何在Objective-C中调用它?以下不起作用:

[UIImage bundleNamed:@"Bar"];
[[UIImage alloc] initWithBundleNamed:@"Bar"];

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

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

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

#import <ModuleName-Swift.h>

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

[[UIImage alloc] initWithBundleNamed: @"Bar"];

我没有必要将初始化程序声明为public,因为默认级别internal足以支持我的模块。

3 个答案:

答案 0 :(得分:6)

结帐Using Swift with Cocoa and Objective-C (Swift 2.2) - Mix and Match。它似乎归结为

  1. 制作便利初始值设定项public
  2. 将XCode生成的头文件[YourProductModuleName]-Swift.h导入您的代码

答案 1 :(得分:1)

请注意!如果您正在使用Objective-C中不可用的任何Swift功能(例如Optional值),则在Objective-C中将无法使用它。 所以修复它们。

 public convenience init(title:String?, message:String?) {
    self.init()
    self.title = title
    self.message = message
}

上面的代码不可访问,因此在这种情况下,删除可选选项会有所帮助。

答案 2 :(得分:1)

  

是的,我们可以使用它注意:@objc和public很重要

 @objc public init(url: URL) { 
   //your code 
 }