-
[Swift] Property Observer (μμ± κ°μμ) λ?iOS/π Swift 2020. 11. 27. 23:18
1μ°¨ μμ : 2021/06/02
"μμ±κ°μ λ³κ²½μ κ°μνλ€"
μλ νμΈμ. μ΄λ²μκ°μ μμ± κ°μμμ λν΄μ μμλ³΄κ² μ΅λλ€πΆ
μ²μμλ λ¬Έλ² μ λλ§ μ μ κΈμ΄μλλ°, λ°°μ°λ€ 보λ μ κ³ μΆμ λ΄μ©μ΄ λ§μμ Έμ μΆκ°νκ² λλ κ² κ°μμ.
κ·ΈλΌ μμν΄λ³Όκ²μ!!
μμ± κ°μμ(Property Observer) λ μμ±(Property) μ΄ μλ‘μ΄ κ°μΌλ‘ λ³κ²½ λ λ νΈμΆ λλ μ½λ λΈλμ λλ€.
λΈλ‘λ§ μΆκ°ν΄ λμΌλ©΄ μμ±μ΄ λ³κ²½λ λλ§λ€ νΈμΆλμ΄μ μμ±κ°μμλ₯Ό μ¬μ©νλ©΄ μ΄λ²€νΈμ λμνκΈ° μ½μ΅λλ€.
var observingValue: String = "Hello" { didSet { self.textLabel.text = observingValue } }
μμ μ½λλ₯Ό μλ‘ λ€μλ©΄, observingValue λΌλ String νμμ μμ± κ°μ΄ λ³κ²½ λμμ λ, μμ±κ°μμλ‘ κ΅¬νν didSet μ΄λΌλ λΈλ‘μ μλμΌλ‘ νΈμΆλ©λλ€.
κ·Έλ¦¬κ³ λΈλ‘ λ΄λΆμμλ μ΄λ€ UITextLabel μ text λ΄μ©μ λ³κ²½λ obersingValue κ°μΌλ‘ μ μ©μν€κ³ μμ΅λλ€.
κ·Έλ°λ° μμ± κ°μ΄ λ³κ²½λλ€λ κ²μ΄ μ νν μ΄λ€ κ²μ μλ―Ένλμ§ μμλμ?
μμ±κ°μμλ μμ±μ νμμ΄ κ° νμμΌ λμ μ°Έμ‘° νμ μΌ λλ₯Ό ꡬλΆμ§μ΄μ μκ°νμ§ μμΌλ©΄, μμνμ§ λͺ»ν λ Όλ¦¬μ μ€λ₯λ₯Ό κ²ͺμ μ μμ΅λλ€.
κ°λ΅ν μ΄μ λ₯Ό λ§μλ리μλ©΄,
κ° νμμ λ§ κ·Έλλ‘ κ°μ λ΄κ³ μμ§λ§, μ°Έμ‘° νμμ κ°μ `ν΄λΉ κ°μ΄ μμΉνκ³ μλ λ©λͺ¨λ¦¬μ μ£Όμ` λ₯Ό λνλ΄κΈ° λλ¬Έμ λλ€.
κ° νμκ³Ό μ°Έμ‘° νμ λΉκ΅μ κ΄ν μμΈν λ΄μ©μ μ κ° μ΄μ μ μ μ κΈμ μ°Έκ³ ν΄μ£ΌμΈμ!
μ°Έκ³ κΈ : Value Type vs Reference Type
Syntax
μ°μ μμ± λ¬Έλ²λΆν° μ΄ν΄λ³΄κ² μ΅λλ€.
var name: String = "test" { willSet { print(newValue) } didSet { print(oldValue) } } name = "abc" // prints "abc" - willSet λΈλ‘μ΄ νΈμΆλ κ² // prints "name" - didSet λΈλ‘μ΄ νΈμΆλ κ²
μμ± κ°μμλ μ μΈν κ° λ€μ { } λΈλ‘μ μΆκ°νμ¬ κ΅¬νν μ μμ΅λλ€.
κ·Έλ¦¬κ³ λΈλ‘ μμλ λ κ°μ§ μ’ λ₯μ λΈλ‘ μ€ νλ μ΄μμ μΆκ°ν΄μΌν©λλ€.
' willSet ' λΈλ‘μ κ°μ΄ λ³κ²½λκΈ° μ§μ μ νΈμΆλ©λλ€.
μ΄ λΈλ‘ μμμλ newValue λΌλ μ΄λ¦μ μμ±μ μ¬μ© ν μ μμ΅λλ€. λ³κ²½λ κ°μ λ΄κ³ μμ΅λλ€.
λ§μ½ Parameter name μ μ§μ ν΄μ λ°λλ€λ©΄ λμ΄μ newValue λ μ¬μ©ν μ μκ³ , μ§μ ν μ΄λ¦μ μ¬μ©νκ² λ©λλ€.
' didSet ' λΈλ‘μ κ°μ΄ λ³κ²½λ μ§νμ νΈμΆ λ©λλ€.
μ΄ λΈλ‘ μμμλ oldValue λΌλ μ΄λ¦μ μμ±μ μ¬μ© ν μ μμ΅λλ€. λ³κ²½ μ΄μ μ κ°μ λ΄κ³ μμ΅λλ€.
λ§μ½ Parameter name μ μ§μ ν΄μ λ°λλ€λ©΄ λμ΄μ oldValue λ μ¬μ©ν μ μκ³ , μ§μ ν μ΄λ¦μ μ¬μ©νκ² λ©λλ€.
:: λ³΄ν΅ νλΌλ―Έν°λ₯Ό μλ΅νκ³ oldValueλ₯Ό κ·Έλλ‘ μ¬μ©νλλΌκ΅¬μ μ λ κ·Έκ² νΈνλ―π€
νΉμ§
μμ± κ°μμλ μΌλ° μ μ₯ μμ±μ μΆκ°ν μ μμ΅λλ€.
λ¨, μμλ ν λ² μ΄κΈ°ν λλ©΄ κ°μ΄ λ³κ²½λ μ μμΌλ―λ‘ μΆκ°ν μ μμ΅λλ€.
μΆκ°μ μΌλ‘ μμλ°μ μ μ₯ μμ±κ³Ό κ³μ° μμ±(Computed Property) μλ§ μμ± κ°μμλ₯Ό μΆκ°ν μ μμ΅λλ€.
μ΄λ κ³μ° μμ±μ κΈ°μ‘΄μ μλ getter μ setter λ κ·Έλλ‘ μλν©λλ€.
κ° νμ κ³Ό μ°Έμ‘° νμ μμμ λμ μ°¨μ΄π―
κ° νμ μμλ μμ νμ κ²μ²λΌ κ°μ΄ λ³κ²½λ λ λ§λ€ νΈμΆμ΄ μ λ©λλ€
μ°Έμ‘° νμ μμλ κ°μ΄ λ³κ²½λ λ νΈμΆμ΄ μ λμ§λ§,
λ¨ νκ°μ§βοΈβοΈβοΈβοΈ κ°μ λ³κ²½ν κ²κ°μλ° μ€μ λ‘λ λ³κ²½λμ§ μλ κ²½μ°λ§ μ μν΄μ£Όλ©΄ λ©λλ€.
import UIKit class ViewController: UIViewController { var myImage: UIImageView? { didSet { print("myImage DidSet") } } override func viewDidLoad() { super.viewDidLoad() // 1 myImage = UIImageView() /// prints "myImage DidSet" // 2 myImage!.frame = .zero /// didSet νΈμΆμ΄ μΌμ΄λμ§ μλλ€. } }
μ μ½λλ λ°μ λ¬Έμ₯μ ν μ€μ© μ½μ΄λ³΄μλ©΄ μ΄λ€ κ²½μ°μΈμ§ λ°λ‘ μκ² λμ€κ±°μμ!!
* UIImageVIew ν΄λμ€λ μ°Έμ‘° νμ μ λλ€.
* μ°Έμ‘° νμ μ κ°μ [κ°μ΄ μ μ₯λ μ£Όμ κ°] μ λλ€.
* μ°Έμ‘° μΈμ€ν΄μ€μ μμ±μ λ³κ²½ν΄λ μ£Όμ κ°μ λ°λμ§ μμ΅λλ€.
<1λ² μ½λμμ>
μ΅μ΄μ nil λ‘ μ΄κΈ°ν λμλ myImageλ 1λ² μ½λμμ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μ»κ² λμμ΅λλ€!!
λ μ νν λ§νλ©΄ μ°Έμ‘° κ°μ μ»κ² λμμ£ .
κ·Έλμ κ°μ λ³κ²½μ΄ μΌμ΄λ¬μ΅λλ€. [ nil -> (μ£Όμ κ°) ]
didSetμ΄ νΈμΆλ©λλ€.
<2λ² μ½λμμ>
myImage μΈμ€ν΄μ€μ μμ±μ λ³κ²½νκ³ μμ΅λλ€.
μ°Έμ‘° νμ μμ μμ± λ³κ²½λ§μΌλ‘λ μ£Όμκ° λ³κ²½λμ§ μμ΅λλ€.
κ°μ λ³κ²½μ΄ μμΌλ didSetμ νΈμΆλμ§ μμ΅λλ€.
μΆκ° μ 보
NOTE 1
The willSet and didSet observers of superclass properties are called when a property is set in a subclass initializer, after the superclass initializer has been called. They aren’t called while a class is setting its own properties, before the superclass initializer has been called.
For more information about initializer delegation, see Initializer Delegation for Value Types and Initializer Delegation for Class Types.
ν μ€ μμ½
μνΌν΄λμ€μ μμ± κ°μμλ μλΈν΄λμ€μ μ΄κΈ°ν κ³Όμ μμ μνΌν΄λμ€μ μ΄κΈ°νκ° μλ£λ μ΄νμ λμνλ€.
Initializer Delegation μ μν μλΈν΄λμ€μ μ΄κΈ°ν κ³Όμ μ λν΄ μκ³ κ³μ κ°μ? βοΈβοΈ
NOTE 2
If you pass a property that has observers to a function as an in-out parameter, the willSet and didSet observers are always called. This is because of the copy-in copy-out memory model for in-out parameters: The value is always written back to the property at the end of the function. For a detailed discussion of the behavior of in-out parameters, see In-Out Parameters.
ν μ€ μμ½
μμ± κ°μμκ° λ¬λ¦° μμ±μ λ©μλμ in-out νλΌλ―Έν°λ‘ μ λ¬νλ©΄, λ©μλμ νΈμΆ μμ κ³Ό λ°ν μμ μ΄ 2ν νΈμΆλλ€.
In-Out νλΌλ―Έν°μ μ νν λμμ λͺ°λλλ°, μ°Έκ³ νλ©΄ μ’μ κ² κ°μ΅λλ€!
λ!
π€π’[μ°μ§±μ iOS λΈλ‘κ·Έ]π΅π»
iOSλ₯Ό 곡λΆνλ©΄μ λ°°μ΄ λ΄μ©μ κΈ°λ‘νκ³ μμ΅λλ€.μ°Έκ³ μλ£: https://docs.swift.org/swift-book/LanguageGuide/Properties.html
'iOS > π Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Mutability of Collections - Collections (0) 2020.12.01 Self Type - General (0) 2020.11.27 Side Effect - General (0) 2020.11.24 Nested Functions - Functions (0) 2020.11.08 Function Types - Functions (0) 2020.11.08