iOS/Swift

Swift) Protocol을 이용한 코드 개선

Brad_Heo 2024. 5. 24. 08:46

Protocol으로 반복되는 코드를 개선해 봅시다.

  • extension 활용

예시


ex) protocol 코드

protocol GameProcess: AnyObject {
    func start()
    func end()
}

extension GameProcess {
    func start() {
        print("Start Game")
    }   

    func end() {
        print("End Game")
    }
}

먼저 프로토콜을 사용해서 기능을 정의합니다.
그리고 extension으로 기능에 대한 상세 구현 합니다.

수정사항 x

ex) 예시코드 1

class WarGame: GameProcess {

    func go() {
        start()
    }
}

let warGame = WarGame()
warGame.go()

// ->> "Start Game"

ex) 예시코드 2

class WarGame: GameProcess {
    weak var gameProcess: GameProcess?

    init() {
        gameProcess = self
    }

    func go() {
        gameProcess?.start()       
    }
}

let warGame = WarGame()
warGame.go()

// ->> "Start Game"

WarGame 클래스 객체에 GameProcess 프로토콜을 채택하고, 채택되어 있는 함수를 실행시키면 print 문이 정상적으로 호출 됩니다.

다만 객체에서 필요시 다른 동작으로 구현할 수도 있습니다. -> 무조건 protocol에서 정의된 대로 동작하는 건 아님

참고

  • 예시코드1, 2 스타일이 살짝 다른데, 기능은 동일 합니다. 저는 개인적으로 2번의 스타일을 좋아하는데, 그 이유는 이 클래스 객체에서 채택된 프로토콜의 함수를 명확하게 알 수 있기 때문입니다.
  • 예시코드2 처럼 프로퍼티에 프로토콜 타입을 적용하기 위해선 해당 프로토콜에 AnyObject 타입을 채택해야 합니다.
    AnyObject도 생각보다 양이 많아 따로 참고해야합니다.. 중요한 건 AnyObject가 채택이 되어 있다면 클래스 타입만 저장할 수 있게 됩니다.(Any는 모두 타입 저장 가능..)

수정사항 o

ex) 예시코드 1

class WarGame: GameProcess {
    func start() {
        print("Start WarGame")
    }
}

let warGame = WarGame()
warGame.start()

// ->> "Start WarGame"

ex) 예시코드 2

class WarGame {
    weak var gameProcess: GameProcess?

    init() {
        gameProcess = self
    }

    func go() {
        gameProcess?.start()
    }
}

extension WarGame: GameProcess {
    func start() {
        print("Start WarGame")
    }
}

let warGame = WarGame()
warGame.go()

// ->> "Start WarGame"

객체에서 실제로 구현한 코드가 우선순위를 가지게 됩니다.

마무리


해당 기능(패턴)을 통해 반복되는 코드를 관리할 수 있고, 동일한 기능에 대해서 수정이 필요로 할 때, 해당 프로토콜의 함수만 수정하면 됩니다.
그리고 Coordinator 패턴 등에 활용될 수 있으므로, 알아두면 좋을 것 같습니다.

'iOS > Swift' 카테고리의 다른 글

Swift) UUID + KeyChain  (0) 2024.05.31
Swift) UIkit 화면 이동 - FullScreen  (0) 2024.05.21
Swift) Continuations 활용  (0) 2024.05.20
클로저 (Closures) - 클로저 표현  (0) 2023.04.25
콜렉션 타입(Collection Types) - 셋(Sets)  (0) 2023.04.21