我的问题很简单,我只是想了解为什么有些人使用extension
来表示UITableViewController
的委托方法?为什么不在控制器内部直接编码?我的意思是,我看到有人这样做:
class MyTableViewController: UITableViewController {
// bla bla
}
extension MyTableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
}
...
}
在扩展中使用委托方法实现有什么好处?为什么不在没有扩展名的情况下将代码放在MyTableViewController中?如果这是一个惯例,那么,为什么呢?这样做有什么好处&什么是坏的不做呢?
答案 0 :(得分:0)
今天我们的代码可维护性比Performance
更重要考虑到这一点,越来越多的程序员用奢侈的策略来搜索完成这项任务。使用扩展名就是其中之一。
使用扩展程序,您可以使代码更具可读性。
但这个技巧真的有用吗?
单一责任原则确认一个对象应该负责一项任务。
在我们的ViewControllers中,我们通常会放置很多东西,比如TableView,IBAction,CollectionView等......
那么,如何在不使用扩展程序的情况下关注SRP?
只需创建一个新委托管理的对象,例如TableView。
class TableController: NSObject {
var dataSource: [Any]
init(dataSource: [Any]) {
super.init()
self.dataSource = dataSource
}
}
// here extension could help you to make your code more readable
extension TableViewController: UITableViewDataSource {
/* the TableViewDataSource method */
}
所以,现在,在你的ViewController中你可以这样做:
class ViewController: UIViewController {
@IBOutlet var tableView: UITableView!
var tableController: TableController!
override func viewDidLoad() {
super.viewDidLoad()
self.tableController = TableController.init(dataSource: [1,2,3])
self.tableView.dataSource = self.tableController
}
}
希望这能帮到你;)
答案 1 :(得分:0)
UIViewController通常包含许多函数,如IBOutlets, Private helper functions, IBActions and ViewController LifeCycle
方法等。如果将所有代码放在ViewController中,随着我们添加更多功能,它将变得难以阅读并难以维护。扩展是将单独文件中的逻辑功能分开的方法之一,以便在需要时轻松读取和维护代码并进行修改。使用扩展将所有确认为UITableViewDataSource等协议的函数放在一边。
使用扩展的一个好处是您可以创建多个文件并添加普通类中的函数。
缺点是你无法从类中访问私有变量也无法在扩展中声明常量。
如果您希望将代码保存在同一个文件中,那么使用//MARK:
是另一种对类似功能进行分组的方法
//MARK: ViewController LifeCycle
override func viewDidLoad() {
super.viewDidLoad()
}