[英]Is it possible to call Swift convenience initializer in Objective-C
假设我在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
的默认级别对于我的模块来说已经足够了。
查看使用Swift与Cocoa和Objective-C(Swift 2.2) - 混合和匹配 。 它似乎归结为
public
你的便利初始化,和 [YourProductModuleName]-Swift.h
导入到您的代码中 请注意! 如果您使用Objective-C中没有的任何Swift功能(如可选值),则在Objective-C中无法访问它。 所以解决它们。
public convenience init(title:String?, message:String?) {
self.init()
self.title = title
self.message = message
}
以上代码无法访问,因此在这种情况下删除可选项将有所帮助。
是的我们可以使用它注意:@objc和公众很重要
@objc public init(url: URL) {
//your code
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.