使用参数从Objective-C调用Swift函数

时间:2018-05-31 19:03:38

标签: objective-c swift objective-c-swift-bridge

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

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

在我的.swift文件中,可以使用:

从我的Objective-C-class中调用它
[URLTask primer];

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

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

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

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

我收到错误:

  

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

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

2 个答案:

答案 0 :(得分:3)

你不能打电话的原因

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

[URLTask ladeURL:testURL];

就目标-C而言,ladeURL: 不是此方法的名称。这就是编译器在说“No visible @interface for”时的意思rURLTask'声明选择器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 ladeURLwithUrl:,但不要;将其翻译为{{ 1}}而不是。“

答案 1 :(得分:1)

将类导入OC时,使用swift编写的方法名称与 withParameterType 连接,作为素数 方法

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

没有可以像这样调用的参数

[URLTask primer];

但是这个

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

被翻译为

[URLTask ladeURLWithUrl:<#NSURL#>];