我希望这会奏效:
protocol Foo : UITableViewDelegate{
}
extension Foo{
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("ROW:\(indexPath.row)")
}
}
class MyVC : UITableViewController, Foo{
//...
}
虽然没有运气,但该方法无法调用。我错过了什么,或者这真的不可能吗?
此外,没有编译器警告/错误,该方法只是没有被调用,有些人可能会认为是错误。
答案 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协议的默认实现。