我有一个用 Swift 编写的协议,应该由多个控制器遵守,其中一些控制器是用 Objective-C 编写的。并非所有人都需要此 Swift 协议中的所有方法,因此首先我决定提供一些具有默认实现的方法,以使它们成为“可选”,但在这种情况下,我的 Objective-C 控制器无法识别我的 Swift 协议。有没有人遇到同样的情况并找到解决方案?我的代码的一些示例:
@objc public protocol SwiftProtocol: AnyObject {
func requiredMethod()
func optionalMethod()
}
extension SwiftProtocol {
func optionalMethod() {}
}
@interface ObjClass ()<SwiftProtocol>
我收到错误:(59, 1) 找不到“SomeProtocol”的协议声明
在方法中使用 @objc public 而不是扩展会产生相同的结果。
TIA 为您提供帮助!
Objective-C 协议不能有默认实现。
Objective-C 协议可以有真正的可选方法/属性,与 Swift 协议不同,Swift 协议只有必需的方法/属性。 Swift 中的解决方法是使用默认实现,但遗憾的是,这些在 Objective-C 中看不到。
我建议创建一个纯 Swift 协议,并且对于所有想要扩展它的 Objective-C 类,用 Swift 编写一致性,然后创建@objc
Swift 中调用默认协议实现的包装函数 - 如果需要调用,如果不需要调用,则忽略它。
大致如下:
protocol SwiftProtocol {
func requiredFunc()
func optionalFunc()
}
extension SwiftProtocol {
func optionalFunc() {}
}
@objc extension ObjcClass: SwiftProtocol {
@objc func requiredFunc() {
print("do something")
}
// This will call the default implementation - can be omitted if you don't need to call the default implementation from Objective-C
@objc func objc_optionalFunc() {
optionalFunc()
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)