【问题标题】:Swift protocol extension in Objective-C classObjective-C 类中的 Swift 协议扩展
【发布时间】:2020-05-07 11:24:23
【问题描述】:

我有一个用 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 为您提供帮助!

【问题讨论】:

    标签: ios objective-c swift swift-protocols


    【解决方案1】:

    Objective-C 协议不能有默认实现。

    Objective-C 协议可以有真正的可选方法/属性,这与 Swift 协议不同,后者只有必需的方法/属性。在 Swift 中解决此问题的方法是使用默认实现,但遗憾的是,这些在 Objective-C 中看不到。

    我建议创建一个纯 Swift 协议,对于所有想要扩展它的 Objective-C 类,在 Swift 中编写一致性,然后在 Swift 中创建调用默认协议实现的@objc 包装函数 - 如果需要被调用,如果不需要调用,直接忽略即可。

    类似的东西:

    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()
        }
    }
    

    【讨论】:

    • 嗨@大卫!谢谢!看起来这正是我想要的。只有一件事——我没有提到这个协议是使用委托模式的。在我实现了这个解决方案之后,Objective-C 停止在 viewDidLoad 中识别委托属性。那么这里有什么取舍呢?
    • @Lina_F 您只需要在 @objc 扩展中创建一个 @objc 属性,将纯 Swift 委托包装为计算属性 - 与函数包装器的工作方式相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多