【问题标题】:How to call Swift initializer methods with multiple param in Objective-C如何在 Objective-C 中调用具有多个参数的 Swift 初始化方法
【发布时间】:2018-03-06 02:19:05
【问题描述】:

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

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 文件中调用此方法,但它在编译时抛出错误。

错误:

/用户/桌面/旧 数据/ChatScreenViewController.m:396:92:否 'NVActivityIndi​​catorView' 的可见 @interface 声明选择器 'initWithFrame:type:color:padding:'

Obj-C 调用代码:

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

我尝试了什么:

在我的 Swift 课程中添加了 @objc

@objc public final class NVActivityIndicatorView: UIView

还是无法访问上面的方法。

我的 Swift 文件:NVActivityIndicatorView.swift

怎么了?

【问题讨论】:

  • 请分享一个错误。
  • 添加了更多详细信息,请查看我更新的答案。
  • 如果我没记错的话,这个问题的原因是在你的 init.xml 中使用了默认参数值。请删除该默认值并试一试。它应该可以工作。
  • 是的@iamyogish 我已经通过删除默认值进行了同样的尝试,但仍然是同样的问题,根本没有运气。
  • 检查您生成的头文件(名称应该类似于MyApp-Swift.h。查看该方法如何(以及是否)在该头文件中暴露给Objective-C。这可能会给我们一些线索发生了什么。另外,如果您还没有,请确保您的 Objective-C 源代码包含该标头。

标签: ios objective-c swift initializer


【解决方案1】:

要在 Objective-C 中可访问和可用,Swift 类必须是 Objective-C 类的后代,否则必须标记为 @objc。

还有这个answer

This apple doc 也会帮助你理解。

因此,您可以选择从某个 Objective C 类继承您的类(在这种情况下,编译器添加 @objc)或将 @objc 自己添加到您的类中。

你还需要添加到你的 Objective C 类-

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

这个特定问题的真正解决方案

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

这个问题是说 optional parameters 不能从 Swift 暴露给 Objective C,因为所有参数都变成了 _Nonnull

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

【讨论】:

  • 完美我已经创建了另一种没有可选的方法并且它有效,非常感谢您对我的问题的研究。
  • 很高兴帮助兄弟。嘿,让我们删除所有的 cmets。
【解决方案2】:
  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

【讨论】:

  • 由于这个原因不允许Method cannot be marked @objc because the type of the parameter 4 cannot be represented in Objective-C
  • 因此尝试将参数 4 更改为非可选参数并删除它的默认值。看看有没有帮助。
【解决方案3】:

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

【讨论】:

猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多