2017-09-03 11 views
0

私の質問は非常に簡単ですが、私はちょうどUITableViewControllerの代理人メソッドのためにextensionを使用している人々がいる理由を理解したいですか?なぜコントローラの中に直接コード化しないのですか?私は人々がこれをやって見て、私は何を意味している:UITableViewControllerのコーディング規約

class MyTableViewController: UITableViewController { 
    // bla bla 

} 

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

延長でのデリゲートメソッドの実装を持つことの利点は何ですか?なぜMyTableViewControllerの中にコードを置かないのですか?コンベンションであれば、どうしてですか?どうすればよいですか?&何が悪いのですか?我々のコードの

答えて

0

今日保守性を念頭に置いてこれでパフォーマンス

よりも重要である、より多くのプログラマが贅沢な計略で、このタスクを達成するために検索します。拡張子の使用はその1つです。

拡張機能を使用すると、コードを読みやすくすることができます。

しかし、このトリックは本当に役に立ちますか?

単一責任原則は、オブジェクトが単一のタスクを担当する必要があることを確認します。私たちのViewControllersで

我々は通常、テーブルビュー、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 
    } 

} 

・ホープこのヘルプあなたは、あなたがすべて置く場合)

0

のUIViewControllerは、一般などIBOutlets, Private helper functions, IBActions and ViewController LifeCycle方法のような多くの機能が含まれていますViewControllerのあなたのコードは、読みにくくなり、より多くの機能を追加するにつれて維持管理が難しくなります。拡張機能は、別々のファイルで論理的な機能を分離する方法の1つで、コードを読み込み、維持したり、必要なときに変更するのが簡単です。拡張機能を使って、UITableViewDataSourceのようないくつかのプロトコルに確認するすべての関数を置くことは1つの方法です。

エクステンションを使用する利点の1つは、複数のファイルを作成し、通常のクラスのような機能を追加することです。

短所として、クラスからプライベート変数にアクセスすることができず、拡張で定数を宣言することができません。

あなたが同じファイルにコードを維持することを好む場合は、//MARK:を使用して

//MARK: ViewController LifeCycle 
override func viewDidLoad() { 
    super.viewDidLoad() 
} 
グループと同様の機能へのもう一つの方法です
関連する問題