4

我想将 Swift 类集成到 UIViewController 类中。我想我所有的设置都是正确的。我有一个带有函数的类 rURLTask:NSObject:

@objc public func primer() {
    print("primer")
}

在我的 .swift 文件中,可以从我的 Objective-C 类调用它:

[URLTask primer];

它打印得很好。另一个功能是:

@objc public func ladeURL(url: URL?) {
    print("loadURL")
}

但是这个我不能从Objective-C调用。我试着写:

NSURL* testURL = [NSURL URLWithString:@"http://www.google.com"];    
[URLTask ladeURL:testURL];

我得到错误:

'rURLTask' 没有可见的@interface 声明选择器'ladeURL:'

我认为有一个非常基本的错误。在另一个项目中使用 Swift 3 中的 Objective-C 效果很好。

4

2 回答 2

11

你不能打电话的原因

@objc public func ladeURL(url: URL?) {
    print("loadURL")
}

通过说

[URLTask ladeURL:testURL];

Objective-C而言,这不是该方法的名称ladeURL:。这就是编译器说“'rURLTask' 没有可见的@interface 声明选择器”时的意思。ladeURL:

就 Objective-C 而言,它的名称是ladeURLWithUrl:. 那是因为您已将url:参数名称公开为外部标签。


如果能够说出来对你很重要

[URLTask ladeURL:testURL];

在 Objective-C 中,你可以这样声明ladeURL

@objc public func ladeURL(_ url: URL?) {
    print("loadURL")
}

看到下划线了吗?这隐藏了参数的外部标签。


另一种允许您保留url:外部标签的解决方案是将 Objective-C 名称声明为objc属性的一部分:

@objc(ladeURL:) public func ladeURL(url: URL?) {
    print("loadURL")
}

这对编译器说:“我知道你想将此方法的名称翻译成 Objective-C as ladeURLwithUrl:,但不要;将其翻译为ladeURL:。”

于 2018-05-31T19:36:56.570 回答
2

当您将类导入 OC 时,用 swift 编写的方法的名称被翻译为与withParameterType连接,作为主要方法

@objc public func primer() {
  print("primer")
}

没有参数可以这样调用

[URLTask primer];

但是这个

@objc public func ladeURL(url: URL?) {
   print("loadURL")
}

被翻译成

[URLTask ladeURLWithUrl:<#NSURL#>];
于 2018-05-31T20:05:15.903 回答