How to make a class conform to a protocol in Swift?

目标 C:

@interface CustomDataSource : NSObject <UITableViewDataSource>


@end

斯威夫特:

class CustomDataSource : UITableViewDataSource {


}

但是,将出现一条错误消息:

  1. 类型“ CellDatasDataSource”不符合协议“ NSObjectProtocol”
  2. 类型“ CellDatasDataSource”不符合协议“ UITableViewDataSource”

正确的方法应该是什么?

51303 次浏览

类型“ CellDatasDataSource”不符合协议“ NSObjectProtocol”

您必须让您的类从 NSObject继承以符合 NSObjectProtocol。香草雨燕类没有。但是 UIKit的许多部分期望 NSObject

class CustomDataSource : NSObject, UITableViewDataSource {


}

但这个:

类型“ CellDatasDataSource”不符合协议“ UITableViewDataSource”

在您的类实现协议的所有必需方法之前,您将会得到该错误。

因此,编写代码:)

类必须从父类继承才能遵守协议。主要有两种方法。

一种方法是让您的类继承自 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
}
}

Xcode 9,帮助实现 Swift 数据源和委托的所有强制方法。

Here is example of UITableViewDataSource:

显示实现强制方法的警告/提示:

enter image description here

点击‘ Fix’按钮,它会在代码中添加所有强制方法:

enter image description here