Swift 2:UITableViewDataSource协议扩展
我一直在玩协议扩展,我有一个问题。 也许我想要实现的目标无法实现。 我有这个游乐场:
//: Playground - noun: a place where people can play import UIKit protocol ArrayContainer { typealias T var array: [T] { get } } class MyViewController: UIViewController, ArrayContainer, UITableViewDataSource { typealias T = String var array = ["I am", "an Array"] } extension UITableViewDataSource where Self: ArrayContainer { func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return array.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Whatever return UITableViewCell() } }
这就是我拥有的和我想要的:
- 我有一个协议ArrayContainer,它只有一个typealias和一个包含这个typealias类型的对象的数组
- 我有一个
UITableViewDataSource
的协议扩展,当该类符合ArrayController
协议时使用。 这只是将数组的项数作为行数返回。cellForRowAtIndexPath
方法没有很好地实现,但它不是问题。 - 我有一个名为
MyViewController
的UIViewController
子类,它实现了这两种协议。
问题是编译器抱怨因为MyViewController不符合UITableViewDataSource
但据我所知,它应该被UITableViewDataSource扩展覆盖。 我在这里错过了什么吗? 或者Objective-C协议可能无法扩展?
我知道回复有点迟,你甚至可能都没有找到这个答案,但我只是遇到了这个问题,需要一个真实世界的“解决方案”。 您可以在类中实现UITableViewDataSource方法,然后立即将工作交给协议扩展,如下例所示。 如果swift进行了不再需要的改进,那么更改回原始post中的代码很简单。
//: Playground - noun: a place where people can play import UIKit protocol ArrayContainer { associatedtype T var array: [T] { get } } class MyViewController: UIViewController, ArrayContainer, UITableViewDataSource { typealias T = String var array = ["I am", "an Array"] func numberOfSectionsInTableView(tableView: UITableView) -> Int { return self.internal_numberOfSectionsInTableView(tableView) } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.internal_tableView(tableView, numberOfRowsInSection: section) } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { return self.internal_tableView(tableView, cellForRowAtIndexPath: indexPath) } } extension UITableViewDataSource where Self: ArrayContainer { func internal_numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func internal_tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return array.count } func internal_tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Whatever return UITableViewCell() } }