์์ฑ ๊ฐ์์(Property Observers)๋?
ํ๋กํผํฐ ์ต์ ๋ฒ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ์์ฑ(property)์ด ๋ณํ ๋ ํธ์ถ์ด ๋๋ค.
var myProperty: Int = 20 {
didSet{
// ๋ณ๊ฒฝ๋ ์งํ์ ํธ์ถ
// oldValue๊ฐ ํธ์ถ๊ฐ๋ฅ
}
willSet{
// ๋ณ๊ฒฝ๋๊ธฐ ์ง์ ์ ํธ์ถ
// newValue๊ฐ ํธ์ถ๊ฐ๋ฅ
}
}
didSet
- ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ง ํ์ ํธ์ถ๋๊ณ , ๋ณํ๊ธฐ ์ ์ ๊ฐ์ด oldValue
๋ก ์๋ ์ ์ฅ๋จ.
willSet
- ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ง์ ์ ํธ์ถ๋๊ณ , ๋ณํ ํ์ ๊ฐ์ด newValue
๋ก ์๋ ์ ์ฅ
- ์ ์ฅ์์ฑ์
var
๋ก๋ง ์ ์ธ์ด ๊ฐ๋ฅlet
์ ๊ฐ์ด ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ด์ฐฐํ ํ์๊ฐ ์์.- ์ง์ฐ ์ ์ฅ ์์ฑ์ ๊ด์ฐฐ์ด ๋ถ๊ฐ๋ฅ
- ์๋ฃํ์ ์ ์ธํ๋ ๊ฒ์ ์ผ๋ฐ ๋ณ์์ ๋์ผ
- ์ ์ฅ ์์ฑ์ ๋ณํ ์์ ์ ๊ด์ฐฐํ๋ ์ค์ง์ ์ธ ๋ฉ์๋
- ํ์ /์ธ์คํด์ค ๋ ๋ค ๊ฐ๋ฅ
- ์์ํ ๊ณ์ฐ ์์ฑ์ ์ฌ์ ์ํ์ฌ ๊ด์ฐฐ ๊ฐ๋ฅ
- ์ผ๋ฐ์ ์ผ๋ก
didSet
์ ๋ง์ด ์ฌ์ฉ - ๋ณ์๊ฐ ๋ณํ๋ฉด, ์
๋ฐ์ดํธ ํ๋ ค๋ ํจํด ๊ตฌํ์ ํ ๋ ์ฌ์ฉ
- ์ํ๋ฉ์ธ์ง๋ ํ๋กํ ์ฌ์ง ์๋ฒ์์์ ๋ณํ -> ํ๋ฉด ์ ๋ฐ์ดํธ
[ ๊ตฌ์กฐ์ฒด, ํด๋์ค, ์ด๊ฑฐํ์์ ์์ฑ๊ฐ์์ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ ๊ฒฝ์ฐ (์ธ์คํด์ค ์์ฑ์ผ ๋) ]
- ์ ์ฅ ์์ฑ
- ์์ํ ์ ์ฅ ์์ฑ์ ๊ฐ์์ ์ถ๊ฐ๋ ๊ฐ๋ฅํ์ง๋ง, ์ฌ์ ์๋ฅผ ํ ์ ์์
- ์์ํ ๊ณ์ฐ ์์ฑ์ ์ฌ์ ์ํด ์์ฑ ๊ด์ฐฐ์ ์ถ๊ฐ ๊ฐ๋ฅ
- ๋ณธ๋์ ๊ณ์ฐ ์์ฑ์ ์์ฑ๊ฐ์์ ์ฌ์ฉ ๋ถ๊ฐ ( ์๋์ ๊ณ์ฐ ์์ฑ์์
getter
๋setter
๋ฅผ ํตํด ๊ฐ์์ ์ญํ ์ ํ ์ ์๊ธฐ ๋๋ฌธ )
- ๋ณธ๋์ ๊ณ์ฐ ์์ฑ์ ์์ฑ๊ฐ์์ ์ฌ์ฉ ๋ถ๊ฐ ( ์๋์ ๊ณ์ฐ ์์ฑ์์
์์ฑ ๊ฐ์์์ ์์
var name: String = "ํ๊ธธ๋" {
didSet{
print("๋ณํ๊ธฐ ์ ์ ๊ฐ: \(oldValue)")
}
willSet{
print("๋ณํ ํ์ ๊ฐ: \(newValue)")
}
}
name = "๋ฐฐ์งํด"
/*
์ถ๋ ฅ:
๋ณํ ํ์ ๊ฐ: ๋ฐฐ์งํด
๋ณํ๊ธฐ ์ ์ ๊ฐ: ํ๊ธธ๋
*/
class UserAccount {
var username: String
var password: String
var loginAttempts: Int = 0 {
didSet {
if loginAttempts >= 3 {
print("๋ก๊ทธ์ธ ๋ณ๊ฒฝ ์๋๊ฐ 3ํ๋ฅผ ์ด๊ณผํ์์ต๋๋ค. ")
print("๊ณ์ ์ด ๋นํ์ฑํ ๋์์ต๋๋ค.")
}
}
}
var isLocked: Bool = false {
didSet {
if isLocked {
print("๊ณ์ ์ด ์ ๊ฒผ์ต๋๋ค.")
}else {
print("๊ณ์ ์ด ์ ๊ธ ํด์ ๋์์ต๋๋ค.")
}
}
}
init(username: String, password: String) {
self.username = username
self.password = password
}
func login(with enteredPassword: String) {
if enteredPassword == password {
print("๋ก๊ทธ์ธ ์ฑ๊ณต!")
loginAttempts = 0
}else {
print("๋ก๊ทธ์ธ ์คํจ!")
loginAttempts += 1
}
}
private func lockAccount() {
isLocked = true
}
func unlockAccount() {
isLocked = false
}
}
let user = UserAccount(username: "EarthSea", password: "1234")
user.login(with: "earthsea")
// ์ถ๋ ฅ: ๋ก๊ทธ์ธ ์คํจ!
user.login(with: "12345")
// ์ถ๋ ฅ: ๋ก๊ทธ์ธ ์คํจ!
user.login(with: "1234!")
/* ์ถ๋ ฅ:
๋ก๊ทธ์ธ ์คํจ!
๋ก๊ทธ์ธ ๋ณ๊ฒฝ ์๋๊ฐ 3ํ๋ฅผ ์ด๊ณผํ์์ต๋๋ค.
๊ณ์ ์ด ๋นํ์ฑํ ๋์์ต๋๋ค.
*/
user.login(with: "ํ๋กํผํฐ ์ต์ ๋ฒ")
/* ์ถ๋ ฅ:
๋ก๊ทธ์ธ ์คํจ!
๋ก๊ทธ์ธ ๋ณ๊ฒฝ ์๋๊ฐ 3ํ๋ฅผ ์ด๊ณผํ์์ต๋๋ค.
๊ณ์ ์ด ๋นํ์ฑํ ๋์์ต๋๋ค.
*/
user.unlockAccount()
// ์ถ๋ ฅ: ๊ณ์ ์ด ์ ๊ธ ํด์ ๋์์ต๋๋ค.