说我在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
足以支持我的模块。
答案 0 :(得分:6)
结帐Using Swift with Cocoa and Objective-C (Swift 2.2) - Mix and Match。它似乎归结为
public
和[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
}