UITableViewController的编码约定

时间:2017-09-03 13:00:49

标签: ios uitableview

我的问题很简单,我只是想了解为什么有些人使用extension来表示UITableViewController的委托方法?为什么不在控制器内部直接编码?我的意思是,我看到有人这样做:

class MyTableViewController: UITableViewController {
   // bla bla

}

extension MyTableViewController {
   override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   }
   ...
} 

在扩展中使用委托方法实现有什么好处?为什么不在没有扩展名的情况下将代码放在MyTableViewController中?如果这是一个惯例,那么,为什么呢?这样做有什么好处&什么是坏的不做呢?

2 个答案:

答案 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()
}