今天我更新了新发布的xCode 6 GM。当我尝试构建我的应用程序时,我得到一个编译器错误,说我的一个View控制器处理表“不符合协议UITableViewDataSource”。之前一切正常(使用xCode 6 Beta 5)
根据文档,协议需要2种方法:
- tableView:cellForRowAtIndexPath:required method
- tableView:numberOfRowsInSection:required method
它们都已实施:
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return feed!.count
}
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
println("HashtagDetailViewController: tableView - cellForRowAtIndexPath called")
let cell = tableView.dequeueReusableCellWithIdentifier("postCell", forIndexPath: indexPath) as PostTableCell
cell.loadItem(feed!.toArray()[indexPath.row])
return cell
}
我错过了什么吗?是否有一个新的必需方法不在文档中?谢谢你的帮助
答案 0 :(得分:7)
许多Swift签名在最新测试版中使用了选项。因此,您现有的实现将成为重载的本地方法,而不是协议方法的实现。如果它是协议中的必需方法,您将获得这些消息,因为编译器假定您没有实现所需的方法。
这是一个小麻烦,但是如果你在这些协议中实现了可选方法的实现,那么它就会变得更加危险。您将不会收到任何编译器警告,并且您认为实现协议方法的方法永远不会被调用。
您必须手动检查每个现有的实现,以确保您的代码不会发生上述情况。
最简单的方法是将光标放在每个方法头中,就像通常在方法的侧窗口中获得快速帮助一样。如果它被正确地键入为协议方法,您将在快速帮助中看到该方法的描述,最后定义的框架。如果由于签名差异而成为本地方法,则您不会在“快速帮助”窗口中看到任何描述,而是会看到相关方法的列表,并且更多地告诉该行说明它是在该本地文件中定义的。
我不知道有什么方法可以防止在这样的框架更改之后手动检查代码中的每个现有可选实现。
协议略有改变:
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
现在是:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
答案 1 :(得分:2)
除了上一个答案,这是正确的,我还要补充一点 - 你可以使用以下语法:
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell {
为了执行一些有用的' if语句'像这样:
if let theIndexPath = indexPath {
var data: NSManagedObject = someList[indexPath!.row] as NSManagedObject;
// your code here
}
或
if let tblView = tableView {
tblView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade);
// your code here
}