2015-01-27 179 views
0

我正在关注this教程在swift中执行TDD。协议继承在swift中

大约一半时间,我们需要创建一个从UITableViewController继承的协议。代码如下所示:

import UIKit 

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

然后,我们创建一个类后不久,符合下面的代码到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中的optionals,但错误仍然存​​在。

我哪里似乎出错了?查看作者给出的最终源代码,同样的错误也存在,这让我认为苹果可能已经改变了我们不知道的语法中的某些东西。

任何想法?

谢谢。

回答

2

这些API已经改变了很多,因为该教程写于2014年9月

看看API参考的UITableViewDataSourcehere

也就是说,主要功能使用的是:

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

这些不再依赖于传入的解包选项(没有附加!

Swift是全新的,API在六月和十一月之间经历了很多变化,所以如果你在线阅读材料,在线检查官方文档总是一个好主意。 (即使官方的Xcode发布和beta版有时也可能有不同的API)

+0

是的,正如在OP中提到的,我试图删除!在参数和问题仍然存在。 有趣的是,当我开始输入'tableView'时,代码完成建议只显示了一些来自UITableViewDataSource的方法,比如titleForFooterInSection和titleForHeaderInSection。然而,我正在寻找的方法,即cellForRowAtIndexPath和numberOfRowsInSection不会由代码完成显示(即使这些方法的当前实现首先被显示)。我感到困惑,为什么会发生这种情况? – coldbuffet 2015-01-27 02:11:02

+1

我只是把[this](http://pastebin.com/an6N0svT)放入故事板,编译器没有抱怨一件事(Xcode 6.2(6C107a))。 (这不是你如何返回'UITableViewCells',但你需要返回一些东西) – cjwirth 2015-01-27 02:25:00

+0

看看你的代码后,我删除了方法签名和cellForRowAtIndexPath中的所有选项,我返回UITableViewCell()就像你做的那样,而不是零。这似乎解决了这个问题。非常感谢你! – coldbuffet 2015-01-27 02:33:01