gpt4 book ai didi

ios - Swift 协议(protocol)作为从 Objective C 类调用的初始化参数

转载 作者:行者123 更新时间:2023-11-30 12:10:54 27 4
gpt4 key购买 nike

我有一个 swift 协议(protocol),它是我为测试 iOS 中的 openUrl 功能而定义的。它看起来像这样:

protocol URLOpener {

func open(_ url: URL, options: [String : Any], completionHandler completion: ((Bool) -> Void)?)
func canOpenURL(_ url: URL) -> Bool

}

extension UIApplication: URLOpener {}

请注意,UIApplication 是符合此协议(protocol)的类。

现在我有一个类,它采用对象 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];

这工作得很好。谁能指导我 URLOpener 协议(protocol)有什么问题,或者我如何让它与 URLOpener 参数一起工作。

最佳答案

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

您必须向 Objective-C 公开协议(protocol)init

@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 .

关于ios - Swift 协议(protocol)作为从 Objective C 类调用的初始化参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46073316/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com