如何在 Objective-C 中使用多个参数调用 Swift 初始化方法

How to call Swift initializer methods with multiple param in Objective-C

我的 Swift 文件中有一个初始化方法,如下所示:

public init(frame: CGRect, type: NVActivityIndicatorType? = nil, color: UIColor? = nil, padding: CGFloat? = nil) {
        self.type = type ?? NVActivityIndicatorView.DEFAULT_TYPE
        self.color = color ?? NVActivityIndicatorView.DEFAULT_COLOR
        self.padding = padding ?? NVActivityIndicatorView.DEFAULT_PADDING
        super.init(frame: frame)
        isHidden = true
}

我想从我的 Objective-C 文件中调用此方法,但它在编译时抛出错误。

错误:

/Users/Desktop/old data/ChatScreenViewController.m:396:92: No visible @interface for 'NVActivityIndicatorView' declares the selector 'initWithFrame:type:color:padding:'

Obj-C调用代码:

NVActivityIndicatorView *objNVActivityIndicatorView = [[NVActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) type:NVActivityIndicatorTypeLineScalePulseOut color:[UIColor blueColor] padding:10]

我试过的:

在我的 Swift class

中添加了 @objc
@objc public final class NVActivityIndicatorView: UIView

仍然无法访问上述方法。

我的 Swift 文件:NVActivityIndicatorView.swift

怎么了?

尝试在Build Phases -> Compile Source 中将@objc 添加到Swift class 并再次调用该方法。我希望这会奏效。

To be accessible and usable in Objective-C, a Swift class must be a descendant of an Objective-C class or it must be marked @objc.

还有这个

This apple doc也会帮助你理解。

所以你的选择是从一些 Objective C class 继承你的 class (在这种情况下编译器添加 @objc)或添加 @objc 你自己到你的 class.

您还需要添加到您的 Objective C class-

#import "<#ProjectName#>-Swift.h"

这个具体问题的真解

请查看this question,您将自己找到解决方案。 :)

那个问题说 optional parameters 不能从 Swift 公开到 Objective C 因为所有参数都变成 _Nonnull.

所以我认为您需要创建另一个没有可选参数和默认参数的初始化程序。

  1. 尝试将@objc 也添加到函数中:

    @objc public init(frame: CGRect, type: NVActivityIndi​​catorType? = nil, color: UIColor? = nil, padding: CGFloat? = nil) {

  2. 您需要创建桥接头。看 https://medium.com/ios-os-x-development/swift-and-objective-c-interoperability-2add8e6d6887