我有一个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参数 .
1 回答
有点晚了,但我只是在努力解决同样的问题 .
您必须将
protocol
和init
都暴露给Objective-C .您始终可以检查生成的头文件,以查看您的Swift代码是否在Objective-C中可用 . 见"Importing Swift into Objective-C" from the Apple docs段 .