Swift Objective-C 中的协议扩展 class

Swift protocol extension in Objective-C class

我有一个用 Swift 编写的协议,应该由多个控制器遵守,其中一些是用 Objective-C 编写的。并非所有人都需要此 Swift 协议中的所有方法,因此起初我决定提供一些具有默认实现的方法来使它们成为 'optional' 但在这种情况下,我的 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 协议可以有真正的可选 methods/properties,不像 Swift 协议只有必需的 methods/properties。 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()
    }
}