231207 TIL_프로퍼티 옵저버

ykyo·2023년 12월 7일

프로퍼티 옵저버

  1. didSet, willSet
    • 변수에 프로퍼티 옵저버를 정의하여 프로퍼티 값의 변경 사항을 모니터링하고, 미리 구현한 코드로 이에 대응할 수 있음
    • 다시 말하면 해당 프로퍼티를 관찰하면서 변경 사항이 발생할 때 실행됨
    • willSet 보다는 didSet 이 많이 사용됨
    • willSet 과 didSet을 둘 다 작성할 경우, willSet이 먼저 실행됨
    • 추가할 수 있는 경우
      • 저장 프로퍼티
      • 연산 프로퍼티
  • didSet
    • didSet은 새 값이 저장된 직후에 호출됨
    • 이전 프로퍼티의 값이 oldValue 로 제공됨
  • willSet
    • willSet은 값이 저장되기 직전에 호출됨
    • 새로운 프로퍼티의 값이 newValue 로 제공됨
var myProperty: Int = 20{
	didSet(oldVal){
    	//myProperty의 값이 변경된 직후에 호출, oldVal 은 변경 전 myProperty 의 값
    }
    willSet(newVal){
    	//myProperty의 값이 변경되기 직전에 호출, newVal 은 변경 될 새로운 값
    }
}

var name: String = "Unknown"{
	willSet{
    	print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
    }
    didSet{
    	print("현재 이름 = \(name), 바뀔 이름 = \(oldValue)")
    }
}

name = "Peter"
// willSet 이 먼저 실행됨
// 현재 이름 = Unknown, 바뀔 이름 = Peter
// 현재 이름 = Peter, 바뀌기 전 이름 = Unknown

--------------------------------------------------------------------------------------
class UserAccount {
	var username: String
    var password: String
    var loginAttempts: Int = 0{
    	didSet {
        	if loginAttempts >= 3{
            	print("로그인 시도가 3회 이상 실패하였습니다. 계정이 잠겼습니다.")
                lockAccount()
            }
        }
    }
    
    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: "user123", password: "password123")
    
    // 로그인 시도
    user.login(with: "wrongpassword")
    // 출력:
    // 잘못된 비밀번호입니다.
    
    user.login(with: "wrongpassword")
    // 출력:
    // 잘못된 비밀번호입니다.
    
    user.login(with: "wrongpassword")
    // 출력:
    // 잘못된 비밀번호입니다.
    // 로그인 시도가 3회 이상 실패하였습니다. 계정이 잠겼습니다.
    // 계정이 잠겼습니다.
    
    // 계정 잠금 해제
    user.unlockAccount() // 계정이 잠금 해제되었습니다. 
}
profile
for ios, swift, etc.

0개의 댓글