델리게이션은 사전상 의미로 대표자, 위임하다, 대리자 라고 해석할 수 있다.
클래스나 구조체가 따로 혹은 일부 수행해야 하는 일을 다른 타입의 인스턴스에게 위임하는 디자인 패턴이다.
특정 액션에 반응하거나 외부 소스의 기본 타입을 알 필요 없이 외부 소스로부터 데이터를 가져오는데 사용될 수 있다.
간단하게 말해서,
A 인스턴스가 하나의 일에만 충실하고 싶을 때, 그 밖의 일들을 B 인스턴스가 대신해서 처리해준다는 것이다.
스위스트에서는 이런 델리게이션의 개념이 적용된 것이 프로토콜이다.
프로토콜은 이전에 공부했듯이 특정 역할을 수행하기 위한 프로퍼티, 메서드, 이니셜라이저 등의 청사진을 정의한다고 알고 있다.
델리게이트는 대신 처리해줄 객체와 처리하라고 시키는 객체로 구분해서 생각하면 된다.
그래서 델리게이션을 사용해 예제 코드를 작성해보았다.
내가 작성하고자한 코드는 다음과 같다.
롤에서 일반 게임을 시작한다.
일반 게임이 시작되고 kill, death, assistance 를 기록한다.
게임이 끝나 승리 또는 패배하게 된다.
여기서 kill, death, assistance 를 기록하는 부분을 델리게이트(KdaRecordDelegate)로 생성해서 사용해보았다.
NormalGame 클래스에서 KdaRecordDelegate 프로토콜을 채택했다.
NormalGame 클래스에서 메서드 요구사항을 정의하고
KDA 를 기록하는 부분에 대해서는 KdaRecordDelegate 에서 대신 처리해준다.
import Swift
// 유저에 대한 클래스 생성
class User {
let name: String
init(name: String) {
self.name = name
}
}
// KDA 를 기록해주는 델리게이트 생성
protocol KdaRecordDelegate {
func kill()
func death()
func assi()
}
// 롤 일반 게임 클래스 생성
class NormalGame: KdaRecordDelegate {
var user: String = ""
var k: Int = 0
var d: Int = 0
var a: Int = 0
init(user: String) {
self.user = user
}
// 게임 시작
func start() {
print("일반 게임을 시작했습니다.")
}
// 게임 승리
func win() {
print("게임에서 승리했습니다.")
}
// 게임 패배
func lose() {
print("게임에서 패배했습니다.")
}
func getState() {
print("현재 \(user) 님의 KDA 는 \(k) / \(d) / \(a) 입니다.")
}
// KdaRecordDelegate
func kill() {
print("적을 처치했습니다.")
k += 1
}
func death() {
print("적에게 죽었습니다.")
d += 1
}
func assi() {
print("적의 처치에 도움을 주었습니다.")
a += 1
}
}
var user: User = User(name: "jaynam")
var game: NormalGame = NormalGame(user: user.name)
game.start()
game.kill()
game.assi()
game.kill()
game.death()
// 현재 상태창을 확인할 때
game.getState()
game.kill()
game.death()
game.win()
출력 결과
일반 게임을 시작했습니다.
적을 처치했습니다.
적의 처치에 도움을 주었습니다.
적을 처치했습니다.
적에게 죽었습니다.
현재 jaynam 님의 KDA 는 2 / 1 / 1 입니다.
적을 처치했습니다.
적에게 죽었습니다.
게임에서 승리했습니다.
예제 코드를 작성하고나서 이렇게 사용하는 게 맞는걸까? 라는 의문이 들었다. ㅎㅎ 너무 허졉해보인다...ㅎ
잘 생각해보니 어플을 개발할 때 delegate와 datasource 를 작성해서 해당 기능을 구현했었던 기억이 있다.
그 때에는 그냥 뷰에 보여주기 위해서 처리하는 코드를 작성하는 부분이구나 라고 생각하고 넘어갔기 때문에
제대로 된 이해를 하고 사용하지 못했다.
물론 지금도 제대로 이해하고 있는지 잘못 이해하고있는지 더 공부해봐야 알 것 같다. ㅎㅎ
델리게이트에 대해서 꼭 알아둬야한다고 한다. 그래서 제대로 이해할 필요가 있다.
지금은 playground 에서 스위프트를 통해 예제를 만들어 보았는데 iOS 에서 다양한 뷰를 만들어보면서 익숙해져야겠다.
- 참고 사이트 -
the-brain-of-sic2.tistory.com/9
magi82.github.io/ios-delegate/
'iOS > Swift' 카테고리의 다른 글
[Swift] 27. 오류 처리 (0) | 2020.12.04 |
---|---|
[Swift] 26. 익스텐션 (extension) (0) | 2020.12.03 |
[Swift] 24. 프로토콜 (protocol) (0) | 2020.12.03 |
[Swift] 23. assert / guard (0) | 2020.11.29 |
스위프트는 어떻게 동작할까? (0) | 2020.11.25 |