swift 中的协议继承

Protocol Inheritance in swift

我正在按照 this 教程在 swift 中执行 TDD。

大约进行到一半,有一点我们需要创建一个继承自 UITableViewController 的协议。代码如下所示:

import UIKit

protocol MenuTableDataSource : UITableViewDataSource {
    func setMenuItems(menuItems: [MenuItem])
}

然后我们不久之后创建一个 class,它符合 MenuTableDataSource,代码如下:

import Foundation
import UIKit

class MenuTableDefaultDataSource : NSObject, MenuTableDataSource {
var menuItems: [MenuItem]?

func setMenuItems(menuItems: [MenuItem]) {
    self.menuItems = menuItems
}

func tableView(tableView: UITableView!,
               numberOfRowsInSection section: Int)
               -> Int
{
    return 1
}

func tableView(tableView: UITableView!,
               cellForRowAtIndexPath indexPath: NSIndexPath!)
               -> UITableViewCell!
{
    return nil;
}
}

但是,我仍然收到一条错误消息,提示类型 'MenuTableDefaultDataSource' 不符合协议 'UITableViewDataSource'。

我也尝试删除参数 numberOfRowsInSection 和 cellForRowAtIndexPath 中的可选项,但错误仍然存​​在。

我好像哪里出错了?看了作者最后给出的源码,同样的错误也存在,这让我觉得苹果可能在语法上做了一些我们不知道的改动。

有什么想法吗?

谢谢。

自 2014 年 9 月编写该教程以来,API 发生了很大变化。

查看 API 参考 UITableViewDataSource here

即您使用的主要功能:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

这些不再依赖于传入的展开的可选值(没有 ! 附加)

Swift 是全新的,APIs 在 6 月和 11 月之间经历了很多变化,所以如果您正在在线阅读资料,最好在线查看官方文档。 (即使是官方 Xcode 版本和测试版有时也会有不同的 API)