관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] protocol을 준수하는 1회용 모델 생성 팁 (protocol 구현체) 본문

Refactoring (리펙토링)

[iOS - swift] protocol을 준수하는 1회용 모델 생성 팁 (protocol 구현체)

jake-kim 2024. 3. 22. 01:39

protocol 준수하는 모델 넘기기

  • ViewController에서 viewModel로 SomeModelable을 준수하는 모델을 넘겨야 하는 경우?
    • 단, SomeModelable을 준수하는 모델은 여기서밖에 사용하지 않음
protocol SomeModelable {
    var a: Int { get }
    var b: String { get }
}

class ViewController: UIViewController {
    let viewModel = ViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        viewModel.configure(model: /*여기!*/)
    }
}

class ViewModel {
    func configure(model: SomeModelable) {
        // ...
    }
}
  • 보통 별도의 .swift파일이나 하단에 SomeModelable을 준수하는 구조체를 생성하여 이 값으로 넘길 수 있음
// bad case
struct MyModel: SomeModelable {
    var a: Int
    var b: String
}
  • 하지만 이 모델은 단순히 한곳에서만 필요하기 때문에, 확장성을 제한하여 MyModel의 코드 응집도를 높일 필요성이 존재
  • 단순히 1회용으로 모델을 넘겨야하는 경우라면 아래처럼 클로저 안에서 모델을 정의하고 이 모델은 외부에서 몰라도 되도록 구현하면 더욱 이 모델은 단순히 데이터를 넘길때 사용하는 용도이구나 라는 코드 의도 파악도 쉬운 장점이 존재
// good case
let instance: SomeModelable = {
    struct TemporaryModel: SomeModelable {
        let a: Int
        let b: String
    }
    return TemporaryModel(a: 12345, b: "67890")
}()

override func viewDidLoad() {
    super.viewDidLoad()
    
    viewModel.configure(model: instance)
}

 

* 전체 코드: https://github.com/JK0369/ExProtocolmpl

Comments