Swift Enum에 Protocol을 채택하여 공통 case 만들기

Louis·2023년 5월 18일
0

ReactorKit, TCA 같은 라이브러리를 사용하다보면 Action을 Enum으로 정의하여 사용하게 되는데요
비슷한 기능을 하는 화면을 만들 때에는 Action 일부도 동일하게 작성하는 경우가 많습니다.
그동안 enum의 case는 프로토콜을 이용하여 통일성을 갖추는게 안된다고 알고있었는데 언제 생겼는지.. 있더군요 ㅎㅎ

그래서 정리해 봅니다.

커뮤니티 메인화면과 아티클 상세화면을 구현한다고 했을 때
모든 화면에서는 loading progress ui를 위한 상태를 처리해야 하고
커뮤니티 화면에서는 새로운 공지사항이 있는지를 항상 표시해야 한다고 할 때

기존에는 작업자에 따라 같은 기능을 처리하더라도 case 명칭이 다를 수 있습니다.

enum CommunityMainAction {
    case isLoading(_ isLoading: Bool)
    case fetchNotice
    
    case fetchArticles(Int)
}

enum ArticleDetailAction {
    case loading(_ value: Bool)
    case fetchAlarm
    
    case fetchArticleDetail(Int)
}

어떤이는 notice 어떤이는 alarm으로... 통일성이 없음.

그러나 공통 기능을 protocol을 채택하게 한다면 아래처럼 작성이 가능해 집니다.
변수, 메소드를 static으로 정의하고 반환 타입을 Self로 정의하면 됩니다.

protocol CommonAct {
    static func isLoading(_: Bool) -> Self
}

protocol CommunityAct: CommonAct {
    static var fetchNotice: Self { get }
}

enum CommunityMainAction: CommunityAct {
    case isLoading(_ isLoading: Bool)
    case fetchNotice
    
    case fetchArticles(Int)
}

enum ArticleDetailAction: CommunityAct {
    case isLoading(_ isLoading: Bool)
    case fetchNotice
    
    case fetchArticleDetail(Int)
}

Xcode에서 조금 불편한 것은 Add Missing Protocol Requirements 기능을 통해 코드 자동완성을 할 경우 case문이 아닌 일반 변수, 메소드 형태로 생성을 해 준다는 점 입니다.

나중에는 이런 부분도 잘 생성해줄 수 있으리라 기대 해 봅니다.

profile
iOS Developer

0개의 댓글