:
@interface CustomDataSource : NSObject <UITableViewDataSource>
@end
在Swift中:
class CustomDataSource : UITableViewDataSource {
}
但是,会出现错误消息:
正确的方法应该是什么?
答案 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)