我想将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效果很好。
答案 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#>];