首页 文章

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

提问于
浏览
0

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

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

    您必须将 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中可用 . 见"Importing Swift into Objective-C" from the Apple docs段 .

相关问题