如何使类符合Swift中的协议?

时间:2014-07-28 08:16:29

标签: objective-c swift

Objective-C中的

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end
在Swift中

class CustomDataSource : UITableViewDataSource {

}

但是,会出现错误消息:

  1. 类型'CellDatasDataSource'不符合协议'NSObjectProtocol'
  2. 类型'CellDatasDataSource'不符合协议'UITableViewDataSource'
  3. 正确的方法应该是什么?

3 个答案:

答案 0 :(得分:243)

  

类型'CellDatasDataSource'不符合协议'NSObjectProtocol'

您必须让您的班级继承自NSObject以符合NSObjectProtocol。 Vanilla Swift课程没有。但UIKit的许多部分都期望NSObject s。

class CustomDataSource : NSObject, UITableViewDataSource {

}

但是这个:

  

类型'CellDatasDataSource'不符合协议'UITableViewDataSource'

预计。在您的类实现协议的所有必需方法之前,您将收到错误。

所以得到编码:)

答案 1 :(得分:0)

在遵循协议之前,类必须从父类继承。主要有两种方法。

一种方法是让您的班级继承自NSObject并与UITableViewDataSource一致。现在,如果要修改协议中的函数,则需要在函数调用之前添加关键字override,如下所示

class CustomDataSource : NSObject, UITableViewDataSource {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

然而,这有时会使您的代码变得混乱,因为您可能需要遵循许多协议,并且每个协议可能具有多个委托功能。在这种情况下,您可以使用extension将符合协议的代码与主类分开,并且您无需在扩展中添加override关键字。所以上面代码的等价物将是

class CustomDataSource : NSObject{
    // Configure the object...
}

extension CustomDataSource: UITableViewDataSource {

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

答案 2 :(得分:0)

Xcode 9,有助于实现Swift数据源的所有强制方法。代表。

以下是UITableViewDataSource的示例:

显示警告/提示以实施强制方法:

enter image description here

点击&#39;修复&#39;按钮,它将在代码中添加所有必需的方法:

enter image description here