Swift

[Swift] Extension(확장)으로 코드 가독성 올리기

devharrry 2020. 1. 5. 01:14

안녕하세요. 

extension을 잘 사용하여 코드 가독성을 올릴 수 있는 방법을 간단하게 소개하려고 합니다.

 

extension은 언제 사용하는가?

extension(확장)은 기존 클래스, 구조체, 열거형, 프로토콜 타입에 새로운 기능을 추가할 때 사용합니다.

 

구성 및 예제

뷰컨트롤러는 많은 코드를 포함하고 있기 때문에 extension(확장)을 올바르게 사용하면 코드 구성을 크게 향상 시킬 수 있습니다.

일단 크게 Class Block, Private Extension, Protocol Extension 이렇게 분리할 것입니다. 

 

1. Class Block 

여기에는 private, public, 오버라이드 메소드, 생명주기 등 내부 메소드가 있는 부분입니다. 

final class ViewController: UIViewController {
    // MARK: - IBOutlet
    @IBOutlet private weak var tableView: UITableView!

    // MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        initView()
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
}

2. Private Extension

여기에는 Private한 메소드, 이벤트가 있는 부분입니다. 

// MARK: - Private
extension ViewController {
    func initView() {
    }
    @IBAction func touchUpInsideNextButton(_ sender: UIButton) {
    }
}

3. Protocol Extension 

뷰 컨트롤러에서 델리게이트 메서드, 그 외 프로토콜 구현부가 있는 부분입니다. (ex 테이블뷰, 콜렉션뷰 델리게이트)

// MARK: - UITableViewDelegate
extension ViewController: UITableViewDelegate {
}
// MARK: - UITableViewDataSource
extension ViewController: UITableViewDataSource {
}

// MARK: - SomeDelegate
extension ViewController: SomeDelegate {
    func someTask() {

    }
}

전체 코드 

import UIKit

final class ViewController: UIViewController {
    // MARK: - IBOutlet
    @IBOutlet private weak var tableView: UITableView!
    @IBOutlet private weak var nextButton: UIButton!

    // MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        initView()
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
}

// MARK: - Private
extension ViewController {
    func initView() {
    }
    @IBAction func touchUpInsideNextButton(_ sender: UIButton) {    
    }
}

// MARK: - UITableViewDelegate
extension ViewController: UITableViewDelegate {
}
// MARK: - UITableViewDataSource
extension ViewController: UITableViewDataSource {
}

// MARK: - SomeDelegate
extension ViewController: SomeDelegate {
    func someTask() {

    }
}

마무리

extension은 Swift언어에서 강력한 기능입니다.
잘 사용한다면 뷰 컨트롤러 안에서 요구사항에 따라 기능을 분리하여 보기 좋은 코드를 작성하는데 많은 도움이 될 것입니다.

'Swift' 카테고리의 다른 글

[Swift] Extension이란  (0) 2020.01.05
[Swift] SwiftLint 적용하기  (0) 2020.01.05
[Swift] 구조체란 무엇인가?  (0) 2020.01.03
[Swift] 델리게이트(Delegate) 패턴이란  (0) 2020.01.03
[Swift] 타입메소드, 인스턴스 메소드란  (0) 2020.01.03