我有一个用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) Cannot find protocol declaration for 'SomeProtocol'Using @objc public in methods instead of extension gave the same result.TIA for your help!
Objective-C协议不能有默认的实现。
Objective-C协议可以有真正的可选方法属性,不像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()
}
}