繁体   English   中英

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

[英]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) - 混合和匹配 它似乎归结为

  1. public你的便利初始化,和
  2. 将XCode生成的头文件[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM