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


121

在Objective-C中:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

在Swift中:

class CustomDataSource : UITableViewDataSource {

}

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

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

正确的方法应该是什么?


1
错误消息中的类名称似乎与您提供的代码不匹配?
Matt Gibson 2014年

2
Swift类默认情况下不会从NSObject继承。除非另有说明,否则它们是自己的基类。
2014年

Answers:


251

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

您必须使您的类继承自,NSObject以符合NSObjectProtocol。Vanilla Swift类没有。但许多地方UIKit期待NSObject秒。

class CustomDataSource : NSObject, UITableViewDataSource {

}

但是这个:

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

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

所以得到编码:)


谢谢@Alex; 您辛苦了一天,因为我一直在努力使我的Swift类符合UICollectionViewDataSource协议。在我的Class中添加NSObject继承解决了它!
iOS编码器

1
我是唯一认为编译警告已足够的人吗?
Magoo 2015年

@Magoo当然,您的意思是不够。“不符合协议”对我而言并不意味着“继承自NSObject”。
罗伊·福克

@RoyFalk我的意思是编译警告足以解决错误...您可能不需要在所有情况下都实现整个协议,并且可能想要在执行之前进行构建...这没什么大不了的,但是感觉有点不必要。
Magoo

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
    }
}

0

Xcode 9帮助实现Swift Datasource&Delegates的所有强制方法。

这是示例UITableViewDataSource

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

在此处输入图片说明

单击“修复”按钮,它将在代码中添加所有强制性方法:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.