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) Info.plist 현지화(Localized) (0) | 2024.07.16 |
---|---|
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 |