sanichdaniel의 iOS 개발 블로그
enum vs protocol as UseCase 본문
Use Case를 작성하면서 enum과 protocol중 어떤걸 사용할지 고민되는 경우가 많았다.
결론부터 말하면 프로토콜을 지향해야하는데 왜 enum보단 프로토콜을 지향해야하는지 알아보자
UseCase로서 Enum을 사용하는 경우가 많다.
Enum은 하나의 namespace로서 작동하고, case를 작성하기 쉽기 때문이다.
(namespace: 여러타입, symbol을 하나의 이름으로 묶어준다)
하지만 usecase로서 Enum은 여러가지 문제점이 있다.
api 정의를 위해 Enum이 사용된 경우를 생각해보자
enum API {
case apiA
case apiB
case apiC
}
API는 HTTPMethod, url, parameter들이 정의 되어야 한다.
extension API {
var httpMethod: HTTPMethod {
switch self {
case .apiA:
return .get
case .apiB:
return .post
case .apiC:
return .put
}
}
}
이런 경우 새로운 케이스를 추가할때마다 긴 switch문 아래 HTTPMethod와 urlString 값을 추가해줘야한다.
하나의 api를 볼때 HTTPMethod, urlString 등을 한곳에서 보고 싶은데, 여러곳에 흩어져 존재한다.
Enum 파일을 분리할수도 없어져 usecase가 하나의 파일에 집중이 되고,
apiAMock 같이 특정 target, scheme에서만 추가되어야하는 usecase가 있어, 다른 파일로 분리하고 싶은 경우 큰 문제가 된다.
구체 타입에 의존하지 않게 프로토콜로 변경하기
protocol APIConfigurable {
var httpMethod: HTTPMethod { get }
var urlString: String { get }
}
struct apiA: APIConfigurable {
var httpMethod: HTTPMethod = .get
var urlString: String = "/api/user"
}
개별 구현체가 서로 간섭하지 않기에, usecase를 개별 파일로 분리 가능하다
여러 구현체들을 하나로 묶어주는 namespace로써 Enum 기능을 가져갈수도 있다
enum API { }
extension API {
struct apiA: APIConfigurable {
...
}
}
extension API {
struct apiB: APIConfigurable {
...
}
}
또한 기존의 enum의 case를 사용했을 경우 특정 case에서만 필요한 값에 대해서는 아래와 같이 불필요한 switch문을 작성해주었어야 했는데
extension API {
var intResult: Int? {
switch self {
case apiA:
return intValue
case apiB:
return nil
}
var stringResult: String? {
switch self {
case apiA:
return nil:
case apiB:
return stringValue
}
}
protocol을 사용할 경우 associated type으로 해결 가능하다
protocol APIConfigurable {
associatedType Result
var: result: Result { get }
}
enum API {}
extension API {
struct apiA: APIConfigurable {
var: result: Int
}
}
extension API {
struct apiB: APIConfigurable {
var: result: String
}
}
결론
Enum은 그 합이 full-set인 데이터를 정의하는 경우에만 사용되어야하고
usecase로 사용되는 경우 프로토콜로 분리해주자!
출처
matt.diephouse.com/2017/12/when-not-to-use-an-enum/
www.swiftbysundell.com/articles/powerful-ways-to-use-swift-enums/
www.swiftbysundell.com/articles/enum-iterations-in-swift-42/
'swift' 카테고리의 다른 글
Generic where cause (0) | 2020.10.01 |
---|---|
Opaque Types (0) | 2020.09.29 |
Type Erasure (0) | 2020.09.28 |
initializer (0) | 2020.09.26 |
Self Type (0) | 2020.09.05 |