Swift协议作为从Objective C类调用的init参数

时间:2017-09-06 10:51:53

标签: ios objective-c swift initialization bridging-header

我有一个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 个答案:

答案 0 :(得分:0)

有点晚了,但我只是在努力解决同样的问题。

您必须将protocolinit都暴露给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