我有一个swift协议,我已经定义了在iOS中测试openUrl
功能。它看起来像这样:
protocol URLOpener {
func open(_ url: URL, options: [String : Any], completionHandler completion: ((Bool) -> Void)?)
func canOpenURL(_ url: URL) -> Bool
}
extension UIApplication: URLOpener {}
请注意,UIApplication
类符合此协议。
现在我有一个类,它采用对象URLOpener
类型来初始化该类
import Foundation
class GenericHandler : NSObject {
required init(urlOpener: URLOpener) {
super.init()
}
func aaa() {
NBLog("aaaaa")
}
}
我想从Objective C使用这个GenericHandler类,但是我发现了一个错误,它无法找到启动器。
GenericHandler *handler = [[GenericHandler alloc] initWithUrlOpener:[UIApplication sharedApplication]];
[handler aaa];
No visible @interface for 'GenericHandler' declares the selector 'initWithUrlOpener:'
但是,如果我更改了启动器以使其接受String
参数,那么它就会开始正常工作。
import Foundation
class GenericHandler : NSObject {
required init(urlOpener: String) {
super.init()
}
func aaa() {
NBLog("aaaaa")
}
}
GenericHandler *handler = [[GenericHandler alloc] initWithUrlOpener:@"test"];
[handler aaa];
这很好用。任何人都可以指导我使用TOLOpener协议的问题,或者我如何使用URLOpener参数。
答案 0 :(得分:0)
有点晚了,但我只是在努力解决同样的问题。
您必须将protocol
和init
都暴露给Objective-C。
@objc protocol URLOpener {
func open(_ url: URL, options: [String : Any], completionHandler completion: ((Bool) -> Void)?)
func canOpenURL(_ url: URL) -> Bool
}
extension UIApplication: URLOpener {}
-
import Foundation
class GenericHandler : NSObject {
@objc required init(urlOpener: URLOpener) {
super.init()
}
func aaa() {
NBLog("aaaaa")
}
}
您始终可以检查生成的头文件,以查看您的Swift代码是否在Objective-C中可用。请参阅“将Swift导入Objective-C”一段from the Apple docs。