Xcode 8 / Swift 3:didSelectRowAt vs didSelectRowAtIndexPath

在我们的Swift 3迁移之后,真的很奇怪。 我们有两个视图控制器,他们都实现UITableViewDelegate和他们都实现public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

但是只有其中一个实际的方法被调用。

如果我在一个不工作public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)更改为public func tableView(_ tableView: UITableView, didSelectRowAtIndexPath: IndexPath) (注意Swift 2.2签名),然后他们都工作。

这两个视图控制器是Swift类,所以我不知道到底是怎么回事。 我很确定这可能是一个Objective-C与Swift的互操作性问题,但是我们的整个项目都是用Swift写的,所以很难弄清楚是什么原因造成的。

任何帮助表示赞赏。 谢谢。

对于Swift 3.0,使用

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ //your code... } 

我遇到了类似的问题。 我的问题是由于有一个超类,它采用了UITableViewDelegate和UITableViewDataSource协议,然后在子类中实现实际的方法。

我所收集的是因为UITableViewDelegate和UITableViewDataSource是Objective-C协议,它们必须由实现这些function的类直接采用。 否则,Swift函数签名将无法正确映射到objective-c函数签名(不确定为什么会出现这种情况)。

在3.0之前的Swift版本中,底层的objective-c函数签名匹配了Swift UITableViewDelegate和UITableViewDataSource协议中的签名。 因此,在3.0之前,有一个超类采用这些协议似乎工作得很好。 但是从Swift 3.0开始,这些签名不再是匹配的。 看起来,要将新样式签名正确映射到底层的objective-c签名,您的类必须直接采用UITableViewDelegate和UITableViewDataSource协议。

因此,在Swift 3.0和更高版本中,如果不直接采用UITableViewDelegate和UITableViewDataSource协议,则函数签名必须匹配旧式的基础objective-c签名,以便正确调用函数。