iOS/🟠 Swift

[Swift] Delegation

woozzang 2021. 1. 26. 09:35

 

Delegation 은 `class` λ‚˜ `struct` κ°€ μžμ‹ μ˜ μ±…μž„ 쀑 일뢀λ₯Ό λ‹€λ₯Έ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ—κ²Œ μœ„μž„ (hand-off or delegate) ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.

 

이 λ””μžμΈ νŒ¨ν„΄μ€ μœ„μž„λœ μ±…μž„μ„ μΊ‘μŠν™”ν•˜λŠ” ν”„λ‘œν† μ½œμ„ μ •μ˜ν•˜λŠ” κ²ƒμœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

κ·Έ 결과둜 ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ νƒ€μž… ( 이 νƒ€μž…μ„ delegate 라고 λΆ€λ¦…λ‹ˆλ‹€ ) 은 μœ„μž„λ°›μ€ κΈ°λŠ₯λ“€μ˜ μ œκ³΅μ„ 보μž₯ν•©λ‹ˆλ‹€.

 

즉, μœ„μž„ν•œ νƒ€μž… (delegating objcet)  의 κΈ°λŠ₯을 μœ„μž„λ°›μ€ νƒ€μž… (delegate)  이 μ œκ³΅ν•©λ‹ˆλ‹€.

 

Delegation은 λ‹€μŒκ³Ό 같은 상황에 μ‚¬μš©ν•©λ‹ˆλ‹€:

 

1. νŠΉμ • action에 λŒ€ν•œ λ°˜μ‘μ„ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜κ±°λ‚˜,

보톡 ~Delegate λΌλŠ” 이름을 가진 ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.

 

2. μ†ŒμŠ€μ˜ νƒ€μž…μ„ μ•Œ ν•„μš”μ—†μ΄ μ™ΈλΆ€ μ†ŒμŠ€μ—μ„œλΆ€ν„° 데이터λ₯Ό μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

보톡 ~DataSource λΌλŠ” 이름을 가진 ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.

 

μ•„λž˜μ˜ μ½”λ“œλŠ” μ£Όμ‚¬μœ„-기반 λ³΄λ“œκ²Œμž„μ— μ‚¬μš©ν•  λ‘κ°œμ˜ ν”„λ‘œν† μ½œμ„ μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

protocol DiceGame {
    var dice: Dice { get }
    func play()
}

protocol DiceGameDelegate: AnyObject {
    func gameDidStart(_ game: DiceGame)
    func game(_ game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int)
    func gameDidEnd(_ game: DiceGame)
}

 

DiceGame ν”„λ‘œν† μ½œμ€ μ£Όμ‚¬μœ„λ₯Ό ν•„μš”λ‘œν•˜λŠ” μ–΄λ– ν•œ κ²Œμž„μ΄λ˜ 채택할 수 μžˆλŠ” ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.

 

κ΄€λ ¨ κΈ€: ν”„λ‘œν† μ½œμ΄ μ •μ˜ν•œ μ†μ„±μ˜ κ°€λ³€μ„±

 

DiceGameDelegate ν”„λ‘œν† μ½œμ€ DiceGame 의 진행을 μΆ”μ ν•˜λŠ” μš©λ„λ‘œ μ±„νƒλ©λ‹ˆλ‹€.

 

ν”„λ‘œν† μ½œμ„ class-only 둜 λ§Œλ“  것은 ν΄λž˜μŠ€κ°€ delegate 을 μ•½ν•œ 참쑰둜 μ €μž₯ν•΄μ•Όν•œλ‹€λŠ” 것을 μ„ μ–Έν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

즉, κ°•ν•œ μ°Έμ‘° 사이클을 λ°©μ§€ν•˜κΈ° μœ„ν•˜μ—¬ delegateλŠ” μ•½ν•œ 참쑰둜 μ„ μ–Έλ©λ‹ˆλ‹€.

 

class-only ν”„λ‘œν† μ½œμ€ ν”„λ‘œν† μ½œ μ„ μ–ΈλΆ€ 콜둠( : ) 뒀에 AnyObject λΆ™μ—¬μ„œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

 

 

 

끝!


πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.