【问题标题】:Implement protocol partially in Objective C and partially in Swift部分在 Objective C 中部分在 Swift 中实现协议
【发布时间】:2020-11-06 22:51:19
【问题描述】:

我可以部分用 Objective C 部分用 Swift 实现一个协议吗?

我有一个现有的 Objective C 类,它在 .h 文件中这样声明。

@interface SetupViewController : UIViewController <UITableViewDataSource> {
    // etc.
}

对应的 .m 文件实现了 UITableViewDataSource 协议。现在我想在 Swift 扩展中重写其中的一些方法。但我希望现在不必用 Swift 重写所有这些。 (这只是一个示例 sn-p,实际的类要长得多。)

@implementation SetupViewController

// I want to rewrite this method in Swift
/*
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2; 
}
*/

// I don't want to rewrite this method in Swift yet
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
    // lots of code
}

所以我将其中一种方法从 Objective C 文件中移到了我的扩展中,如下所示:

@objc extension SetupViewController {
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // new, more involved code
    }
}

但这不会编译。我收到一条错误消息Method 'tableView(_:numberOfRowsInSection:)' with Objective-C selector 'tableView:numberOfRowsInSection:' conflicts with previous declaration with the same Objective-C selector。但是我的Objective-C文件里已经没有numberOfRowsInSection方法了,我把它拿出来了。

似乎只是将 UITableViewDataSource 放在 .h 文件中会使 Swift 扩展认为已经实现了实现协议的方法。

我也尝试将扩展名声明为 @objc extension SetupViewController: UITableViewDataSource 并将其从 .h 文件中删除,但由于扩展名本身没有实现协议,所以失败了。

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    在构建混合了 Swift+Objective-C 代码的项目时,以下是所发生情况的简要总结:

    1. 桥接头被处理
    2. Swift 文件已编译
    3. 编译 Objective-C 文件

    你看到的错误发生在步骤#2,此时编译器看到Objective-C类符合UITableViewDataSource,因此它假设Objective-C代码实现了tableView(_:numberOfRowsInSection:)方法,因此它看到冲突,因为 Swift 代码也实现了该方法。

    问题的根源在于您试图在 Objective-C 中实现一些协议方法,而在 Swift 中实现一些协议方法,这是不可能的,您需要实现所有非可选方法Swift 或 Objective-C 中的协议。

    如果你真的想走这条路,一个可能的解决方案是将协议一致性移到 Swift 端,并将 Objective-C 标头中的所有其他方法声明为该类的公共方法。但这可能会导致其他问题。

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多