swift继承的协议方法覆盖

时间:2016-02-28 18:39:22

标签: ios swift uikit

我希望这会奏效:

protocol Foo : UITableViewDelegate{
}

extension Foo{
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("ROW:\(indexPath.row)")
    }
}

class MyVC : UITableViewController, Foo{
   //...
}

虽然没有运气,但该方法无法调用。我错过了什么,或者这真的不可能吗?

此外,没有编译器警告/错误,该方法只是没有被调用,有些人可能会认为是错误。

1 个答案:

答案 0 :(得分:1)

我认为这是因为您继承了已经实施import pandas as pd def my_data_generator(fp): metadata = [] for line in fp: data = line.strip().split(',') if len(data) == 4: metadata = data elif not metadata: raise ValueError("csv file did not start with metadata") elif data: yield metadata + data df = pd.DataFrame.from_records(my_data_generator(open('somefile.csv'))) print(df) 的{​​{1}}。

您可以轻松测试:

UITableViewController

这将导致

UITableViewDelegate

编译器假定该方法已在直接继承链中实现。因此,不会选择协议中的默认方法。

话虽如此,下面的变体也不起作用。将class MyVC: UITableViewController { func tableView(tableView tv: UITableView, didSelectRowAtIndexPath ip: NSIndexPath) {} } 添加到协议会使我的swiftc段错误...:

error: overriding declaration requires an 'override' keyword

因此,我认为我的答案只有50%是正确的。推测协议扩展仅适用于静态绑定上下文,不包括ObjC协议?

更新:这似乎是正确答案:Protocol-Oriented Programming with UIKit。本质:

  

我们不能做的事情:提供Objective-C协议的默认实现。