본문 바로가기

Swift

[MVVM] associatedtype으로 ViewModel 구조 추상화

728x90

associatedtype

- Generic과 유사한 형태로, Protocol에서 사용될 타입에 대한 네임 스페이스, placeholer이다.

- 실제로 Protocol을 채택해서 사용하기 전까지는 사용되는 타입이 무엇인지 명시가 되지 않는다. 

 

 

MVVM에서 Input/Output 패턴을 사용하면, 우리는 ViewModel마다 Input, Output구조체를 만들어줘야 한다.

이것이 과연 최선의 방법일까?

 

 

이것을 우리는 프로토콜을 이용해서 해결할 수 있다.

프로젝트를 구성하다 보면, 공통적으로 생기는 요소들, 반복되는 속성/메서드를 프로토콜의 형태로 사용할 수 있다.

 

 

만약, 프로퍼티의 타입이 동일하다면 그냥 작성하면 되지만,

각 화면의 뷰모델마다 서로 다른 Input, Output을 갖게 된다.

 

그러므로 우리는 타입이 달라질 경우를 생각해서 asssociated type으로 지정할 수 있다.

다른 유형이 생길 수 있으니(= 뷰모델마다 다른 유형의 Input, Outpt을 가지게 될테니) 임의의 타입을 지정해두고 프로토콜이 적용되는 순간 실제 타입을 지정하는 것이다.

 

 

간단하게 말해서 프로토콜에서 사용되는 제너릭이라고 볼 수 있다.

 


// associated type == generic

protocol CommonViewModel {
    associatedtype Input
    associatedtype Output
    
    func transform(input: Input) -> Output
}

코드로 나타내면 위와 같다.

 

associatedtype으로 정의한 이유는,

- 타입이 여러개 존재한다. 

- 각 뷰모델마다 input/output의 개수가 다르다. 

- 내부에 구성되어 있는 프로퍼티가 다 다르기 때문에, 공통적인 요소를 뽑아내기가 어렵다. (어떤 타입인지 명확하게 정의하기 어렵기 때문)