Swift Extension을 통한 클래스 분할

10435 단어 Swift
하고 있는 사람에게는 지금 무슨 말을 해야 할 것 같은데, 몇 가지 써보고 싶은 게 있으니 정리를 해보자.
잘못, 의견, 감상, 자기가 이렇게 쓰는 거야!기다리시면 꼭 메모 남겨주세요.
사용하는 X코드는 8.3.3입니다.

어떻게 써요?


한 반은 Extension으로 여러 자로 나뉜다.나는 대체로 아래의 기준에 따라 구분한다.
대체로 대략적인 기준일 뿐, 하나의 Extension이 길어졌다는 생각에 분리된 것도 있다.그곳은 융통성이 있어야 한다.
  • 속성 및 초기화, 라이프 사이클
  • UI 관련 프로세싱
  • 각종 협의의 실현
  • (버튼 등)동작
  • 애니메이션
  • 통신/스토리지 시스템
  • 잠깐만...예를 들어 VC의 코드에는 다음과 같은 느낌이 있다.내용이 알맞다.
    견본
    import UIKit
    
    // MARK: vars and lifecycle
    class ViewController: UIViewController {
    
        @IBOutlet fileprivate weak var tableView: UITableView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.setupUI()
        }
    }
    
    // MARK: - UI
    extension ViewController {
    
        fileprivate func setupUI() {
            self.setupHeader()
            self.setupTableView()
        }
    
        private func setupHeader() {
            self.title = "hoge"
            self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "fuga", style: .plain, target: self, action: #selector(self.didTapRightBarButton(_:)))
        }
    
        private func setupTableView() {
            self.tableView.dataSource = self
            self.tableView.delegate   = self
        }
    }
    
    // MARK: - UITableViewDataSource
    extension ViewController: UITableViewDataSource {
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 5
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            return UITableViewCell()
        }
    }
    
    // MARK: - UITableViewDelegate
    extension ViewController: UITableViewDelegate {
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            // do something
        }
    }
    
    // MARK: - actions
    extension ViewController {
    
        func didTapRightBarButton(_ sender: UIBarButtonItem) {
            // do something
        }
    
        @IBAction func didTapButton1(_ sender: UIButton) {
            // do something
        }
    
        @IBAction func didTapButton2(_ sender: UIButton) {
            // do something
        }
    }
    

    좋은 일


    전망이 피다


    코드를 보자마자 무슨 블록인지 알 수 있다.댓글로 나누는 방법도 있지만 개인적으로 그것보다 외관이 더 예쁘다고 생각해요.

    요약 관련 처리


    UI 관련 처리, 정계자 및 접근법 등 근접 처리를 함께 적으면 읽기 쉬운 코드다.

    proivte의 범위가 좁아짐


    나는 일부 속성/방법을 만들 수 있다고 생각한다. 예를 들어 어떤 방법의 조수 방법 등은 반 전체에서 볼 수 없어도 된다.
    이 경우 Extension으로 분리하여 provate를 미리 추가하면 가시성을 줄일 수 있습니다.

    나쁘다고 생각하는 일


    유형량이 많아지다


    분리된 부분extension クラス名만 쓰니까 좀 귀찮아요.
    기본적으로 복제품이어서 장점이 다른 것보다 훨씬 크기 때문에 신경 쓸 필요가 없다.

    할 수 있었으면 좋겠어요.


    store property 사용


    Extension에서 store property를 정의할 수 없습니다.
    컴퓨터property라면 정의할 수 있기 때문에 매번 계산할 수 있는 것은 그것을 사용합니다.
    컨디션을 유지하고 싶을 때 반에서 정의한 곳에 속성을 쓰는 것을 포기한다.
    어떤 Extension 이외에 사용하지 않는 속성이 자주 나오기 때문에 정의할 수 없습니까?

    IBOutlet/IBAction에 직접 연결


    IBcontrol+ドラッグ에서 줄을 당겨도 Extension 내에서는 반응이 없다.
    코드 핸드@IBAction func didTapButton1(_ sender: UIButton) { ...처럼 저장할 때 나오는 링을 IB로 당기면 연결할 수 있다.
    좀 귀찮으니까 엑텐션에 좀 끌려가면 안 될까.


    계약 실행 시 위치 제한


    어떤 Extension에서 협의의 실시를 선언하더라도 그 반이 협의를 실시한다고 선언했을 뿐이다.
    선언 내용과 다른 엑텐션으로도 가능하다는 것이다.
    이렇게
    // プロトコルの実装は宣言するけど中身はなし
    extension ViewController: UITableViewDataSource {}
    
    // こちらでUITableViewDataSourceを実装する
    extension ViewController {
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 5
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            return UITableViewCell()
        }
    }
    
    쓴 사람은 주의해야 하지만 발표하는 곳에서도 반드시 실시해야 한다는 것이 어려운가.

    끝말


    나는 같은 것을 총괄하고 다른 것을 분리하는 것이 디자인의 기본이라고 생각한다.MV~ 등에 비하면 아주 작은 일일지도 모르지만, 이런 작은 일로 코드의 읽기 쉬운 성질을 바꿀 수 있다고 생각해서 더 좋은 방법을 모색하고 싶습니다.

    좋은 웹페이지 즐겨찾기