2017-09-03 100 views
0

我的問題很簡單,我只想了解爲什麼有些人使用extension代表那些代理方法爲UITableViewController?爲什麼不直接在控制器內部編碼?我的意思是,我看到人們這樣做:UITableViewController的編碼約定

class MyTableViewController: UITableViewController { 
    // bla bla 

} 

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

什麼是具有擴展名的委託方法實現的好處?爲什麼不把代碼放在沒有擴展名的MyTableViewController裏面呢?如果這是一個慣例,那麼,爲什麼?有什麼好做的&什麼是壞不做的?我們的代碼

回答

0

今天維護的是記住比性能

更重要

有了這個,更多的程序員搜索來完成與奢侈的計策這個任務。使用擴展是其中之一。

通過擴展可以使代碼更具可讀性。

但這個技巧真的很有用嗎?

單一職責原則確認一個對象應該對單個任務負責。

在我們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 */ 
} 

所以,現在,在您的視圖控制器,你可以這樣做:

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 
    } 

} 

希望這有助於你;)

0

UIViewController中通常包含許多功能,如IBOutlets, Private helper functions, IBActions and ViewController LifeCycle方法等,如果你把所有您在ViewController中的代碼變得很難閱讀,並且難以維護,因爲我們添加了更多功能。擴展是將單獨文件中的邏輯功能分開的一種方法,以便於在需要時閱讀和維護代碼並進行修改。使用擴展將所有確認爲某些協議(如UITableViewDataSource)的函數放入其中是一種方法。

使用擴展的一個好處是您可以創建多個文件並像普通類一樣添加函數。

缺點是您無法從類中訪問私有變量,也無法在擴展中聲明常量。

如果你喜歡保持在同一個文件中的代碼,然後使用//MARK:是另一種方式將類似的功能

//MARK: ViewController LifeCycle 
override func viewDidLoad() { 
    super.viewDidLoad() 
}