我想添加一个默认为NSTableViewDataSource协议的方法。但是当我这样做时,即使在实际数据源中定义了方法,也始终会调用默认值。具体做法是:
我有一个单列NSTableView,它可以在不同的时间采用几种不同的数据源。在一种情况下,我希望数据源不仅能够提供显示的值,还能够提供表中行的背景颜色。在其他情况下,表格可以是单色。我的想法是首先扩展NSTableViewDataSource协议:
extension NSTableViewDataSource
{
func tableView (tableView: NSTableView, colorIndexForRow row: Int) -> Int
{
return 0
}
}
然后在表委托中我把它:
public func tableView (tableView: NSTableView, didAddRowView rowView: NSTableRowView, forRow row: Int)
{
let colorIndex = tableView.dataSource()!.tableView(tableView, colorIndexForRow: row)
rowView.backgroundColor = rowColors[colorIndex]
}
(rowColors只是一个NSColor对象的数组,其中六个用于实验目的。)
最后,我的实验数据源如下所示:
public func numberOfRowsInTableView (tableView: NSTableView) -> Int
{
return 100
}
public func tableView (tableView: NSTableView, objectValueForTableColumn column: NSTableColumn?, row: Int) -> AnyObject?
{
return String(format: "This is row %3i", row)
}
public func tableView (tableView: NSTableView, colorIndexForRow row: Int) -> Int
{
return row % 6
}
我希望这能产生一个表,其中行处于六种颜色的旋转周期中。我实际得到的是一个全部采用rowColors [0]颜色的表。我总是调用colorIndexForRow方法的默认值,即使我在数据源中提供了该方法。我对Swift文档的解读是,只有在没有实际方法时才应该调用协议扩展中的默认值。谁能告诉我我做错了什么?
答案 0 :(得分:1)
原因是协议扩展doesn't support class polymorphism。
您可以将您的功能重写为:
public func tableView (tableView: NSTableView, didAddRowView rowView: NSTableRowView, forRow row: Int)
{
let colorIndex = self.tableView(tableView, colorIndexForRow: row)
rowView.backgroundColor = rowColors[colorIndex]
}
答案 1 :(得分:0)
我决定采取不同的策略:我的简单单功能要求并不能证明处理静态与动态调度问题是正确的。我没有扩展NSTableViewDataSource,而是定义了一个继承的协议:
public protocol ColorTableViewDataSource: NSTableViewDataSource
{
func tableView (tableView: NSTableView, colorIndexForRow row: Int) -> Int
}
然后我的委托函数测试一致性:
public func tableView (tableView: NSTableView, didAddRowView rowView: NSTableRowView, forRow row: Int)
{
if let dataSource = tableView.dataSource() as? ColorTableViewDataSource
{
rowView.backgroundColor = rowColors[dataSource.tableView(tableView, colorIndexForRow: row)]
}
}
我的数据源功能根本没有变化。当我想要彩色行时,我只是声明数据源对象符合新协议。它似乎完全符合我的要求。