Objective-C类中的Swift协议扩展

问题描述 投票:0回答:1

我有一个用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!

ios objective-c swift swift-protocols
1个回答
1
投票

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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.