Swift

[Swift] ν”„λ‘œνΌν‹°(Property) β‘‘ - νƒ€μž…

yeggrrr🐼 2024. 6. 4. 14:02
ν”„λ‘œνΌν‹° κ°μ‹œμž (Property Observers)

- ν”„λ‘œνΌν‹° 값이 변경됨에 따라 μ μ ˆν•œ μž‘μ—…μ„ μ·¨ν•  수 μžˆλ‹€.
- λ˜ν•œ, ν”„λ‘œνΌν‹° 값이 μƒˆλ‘œ 할당될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœλœλ‹€.
- λ³€κ²½λ˜λŠ” 값이 ν˜„μž¬μ˜ κ°’κ³Ό 같더라도 ν˜ΈμΆœλœλ‹€.
- μ €μž₯ ν”„λ‘œνΌν‹°λΏλ§Œ μ•„λ‹ˆλΌ ν”„λ‘œνΌν‹°λ₯Ό μž¬μ •μ˜ν•΄ 상속받은 μ €μž₯ ν”„λ‘œνΌν‹° λ˜λŠ” μ—°μ‚° ν”„λ‘œνΌν‹°μ—λ„ μ μš©ν•  수 μžˆλ‹€.

- 상속받지 μ•Šμ€ μ—°μ‚° ν”„λ‘œνΌν‹°μ—λŠ” ν”„λ‘œνΌν‹° κ°μ‹œμžλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. (μ €μž₯λ˜μ–΄μ•Ό ν•  값이 μžˆμ„ λ•Œλ§Œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ—)

• willSet
ν”„λ‘œνΌν‹°μ˜ 값이 λ³€κ²½λ˜κΈ° 직전에 ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œ

• didSet
ν”„λ‘œνΌν‹° 값이 λ³€κ²½λœ 직후에 ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œ
• willSet & didSet의 λ§€κ°œλ³€μˆ˜
willSet λ©”μ„œλ“œμ— μ „λ‹¬λ˜λŠ” μ „λ‹¬μΈμž → ν”„λ‘œνΌν‹°κ°€ 변경될 κ°’
didSet λ©”μ„œλ“œμ— μ „λ‹¬λ˜λŠ” μ „λ‹¬μΈμž → ν”„λ‘œνΌν‹°κ°€ λ³€κ²½λ˜κΈ° μ „μ˜ κ°’

λ‘˜ λ‹€ λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, μžλ™μœΌλ‘œ 지정됨.
willSet → newValue
didSet → oldValue

<μ‚¬μš© 방식>
willSet(newValue) & didSet(oldValue)
μ΄λ ‡κ²Œ λ‹€μŒμ— μ†Œκ΄„ν˜Έλ‘œ 감싼 이름을 적어주면 됨.

class Account {
    var credit: Int = 0 { // μ €μž₯ ν”„λ‘œνΌν‹°
        willSet {  // 1  //4
            print("μž”μ•‘μ΄ \(credit)μ›μ—μ„œ \(newValue)μ›μœΌλ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€.")
        }
        
        didSet {  // 2  // 5
            print("μž”μ•‘μ΄ \(oldValue)μ›μ—μ„œ \(credit)μ›μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
        }
    }
    
    var dollarValue: Double { // μ—°μ‚° ν”„λ‘œνΌν‹°
        get {
            return Double(credit) / 1000.0
        }
        
        set {  // 6
            credit = Int(newValue * 1000)
            print("μž”μ•‘μ„ \(newValue)λ‹¬λŸ¬λ‘œ λ³€κ²½ μ€‘μž…λ‹ˆλ‹€.")
        }
    }
}
class ForeignAccount: Account {
    override var dollarValue: Double {
        willSet {   // 3
            print("μž”μ•‘μ΄ \(dollarValue)λ‹¬λŸ¬μ—μ„œ \(newValue)λ‹¬λŸ¬λ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€.")
        }
        
        didSet {  // 7
            print("μž”μ•‘μ΄ \(oldValue)λ‹¬λŸ¬μ—μ„œ \(dollarValue)λ‹¬λŸ¬λ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
        }
    }
}
let myAccount: ForeignAccount = ForeignAccount() // μž”μ•‘μ΄ 0μ›μ—μ„œ 1000μ›μœΌλ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€. (Account - willSet)
myAccount.credit = 1000 // μž”μ•‘μ΄ 0μ›μ—μ„œ 1000μ›μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. (Account - didSet)

// μž”μ•‘μ΄ 1.0λ‹¬λŸ¬μ—μ„œ 2.0λ‹¬λŸ¬λ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€. (ForeignAccount - willSet)
// μž”μ•‘μ΄ 1000μ›μ—μ„œ 2000μ›μœΌλ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€. (Account - willSet)
// μž”μ•‘μ΄ 1000μ›μ—μ„œ 2000μ›μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. (Account - didSet)

myAccount.dollarValue = 2 // μž”μ•‘μ„ 2.0λ‹¬λŸ¬λ‘œ λ³€κ²½ μ€‘μž…λ‹ˆλ‹€. (dollarValue - set)
// μž”μ•‘μ΄ 1.0λ‹¬λŸ¬μ—μ„œ 2.0λ‹¬λŸ¬λ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. (ForeignAccount - didSet)

 

νƒ€μž… ν”„λ‘œνΌν‹°

- 각각의 μΈμŠ€ν„΄μŠ€ νƒ€μž…μ΄ μ•„λ‹Œ νƒ€μž… μžμ²΄μ— μ†ν•˜λŠ” ν”„λ‘œνΌν‹°μ΄λ‹€.
- νƒ€μž… ν”„λ‘œνΌν‹°λŠ” νƒ€μž… μžμ²΄μ— 영ν–₯을 λ―ΈμΉ˜λŠ” ν”„λ‘œνΌν‹°μ΄λ‹€.
- μΈμŠ€ν„΄μŠ€μ˜ 생성 여뢀와 상관없이 νƒ€μž… ν”„λ‘œνΌν‹°μ˜ 값은 ν•˜λ‚˜μ΄λ‹€.  
(κ·Έ νƒ€μž…μ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ°’, λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ 곡용으둜 μ ‘κ·Όν•˜κ³  값을 λ³€κ²½ν•  수 μžˆλŠ” λ³€μˆ˜)

• μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹° → λ³€μˆ˜ λ˜λŠ” μƒμˆ˜λ‘œ μ„ μ–Έ
• μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹° → λ³€μˆ˜λ‘œ μ„ μ–Έ
μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” λ°˜λ“œμ‹œ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•΄μ•Όν•˜κ³ , 지연 μ—°μ‚°λœλ‹€.
지연 μ €μž₯ ν”„λ‘œνΌν‹°μ™€ λ‹€λ₯΄κ²Œ 닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ΄λΌκ³  ν•˜λ”λΌλ„ 단 ν•œ 번만 μ΄ˆκΈ°ν™”λœλ‹€λŠ” 보μž₯을 λ°›λŠ”λ‹€.
🧐 μ΄ˆκΈ°κ°’ μ„€μ •ν•΄μ•Όν•˜λŠ” 이유 🧐
μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” μ „μ—° λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œνΌν‹°κ°€ μƒˆλ‘œ μƒμ„±λ˜μ§€ μ•Šκ³ , κ³΅μœ λ˜μ–΄ μ‚¬μš©λœλ‹€.
λ”°λΌμ„œ 처음 μ„ μ–Έ μ‹œ μ΄ˆκΈ°κ°’μ„ 지정해두지 μ•ŠμœΌλ©΄, 이후에 μ΄ˆκΈ°κ°’μ„ 넣어쀄 방법이 μ—†λ‹€.
→ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜κ±°λ‚˜ μ—°μ‚° νƒ€μž… ν”„λ‘ΆνΌν‹°λ‘œ λ§Œλ“€λΌλŠ” errorκ°€ 뜸

🧐 λ³€μˆ˜, μƒμˆ˜ λͺ¨λ‘ μ •μ˜ κ°€λŠ₯ν•œ 이유 🧐
ν•΄λ‹Ή ν”„λ‘œνΌν‹° 호좜 μ „κΉŒμ§€ μ΄ˆκΈ°ν™”κ°€ λ˜μ§€ μ•ŠλŠ”λ‹€.
λ”°λΌμ„œ μƒμˆ˜λ‘œ μ •μ˜ν•˜λ”λΌλ„ μ›ν•˜λŠ” 타이밍에 ν˜ΈμΆœν•˜μ—¬ μ›ν•˜λŠ” 값을 ν• λ‹Ήν•  수 μžˆλ‹€.

🧐 닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ ν•œ 번만 μ΄ˆκΈ°ν™” λ˜λŠ” 이유 🧐
μ „μ—­ λ³€μˆ˜μ™€ 같은 역할을 ν•˜κΈ° λ•Œλ¬Έμ— λ”± ν•œ 번만 μ΄ˆκΈ°ν™”λ˜κ³  λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€λ©΄ μƒˆλ‘œμš΄ 호좜이 μžˆμ„ 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.


μ‚¬μš©ν•˜λŠ” 방법은 μ €μž₯ ν”„λ‘œνΌν‹°, μ—°μ‚° ν”„λ‘œνΌν‹° μ•žμ— static ν‚€μ›Œλ“œλ₯Ό 뢙이면 λœλ‹€.
그러면 νƒ€μž… 이름을 ν†΅ν•΄μ„œ 접근이 κ°€λŠ₯해진닀.
(→ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” 것이 μ•„λ‹Œ, λΆˆλ¦¬λŠ” μˆœκ°„ λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€κ³  μ΄ν›„λ‘œλŠ” ν”„λ‘œνΌν‹°λ₯Ό κ³΅μœ ν•˜λŠ” ν˜•νƒœ)


μ΄μ–΄μ„œ μž‘μ„± μ˜ˆμ •

728x90

'Swift' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Swift] AutomaticDimension  (0) 2024.06.03
[Swift] ν”„λ‘œνΌν‹°(Property) β‘  - μ €μž₯, μ—°μ‚°  (0) 2024.05.28
[Swift] for-in κ³Ό forEach  (0) 2024.05.21
Swift μ–Έμ–΄λž€?  (0) 2024.02.19