프로퍼티 옵저버

handaewon·2023년 12월 8일
0

01.프로퍼티 옵저버(Property Observers)

프로퍼티(Properties)
프로퍼티는 값을 특정 클래스, 구조체, 또는 열거형을 연결합니다.

  • 저장 프로퍼티
  • 연산 프로퍼티

프로퍼티 옵저버를 추가할수 있는 경우는 다음과 같습니다.

  • 정의한 저장 프로퍼티
  • 상속한 저장 프로퍼티
  • 상속한 연산 프로퍼티

didset
새로운 값이 저장되자마자 호출됩니다.
옵저버 내 프로퍼티에 값을 할당한다면 새로운 값으로 방금 설정한 값을 대체합니다.

willset
값이 저장되기 직전에 호출됩니다.
옵저버를 구현한다면 예전 프로퍼티 값을 포함한 상수 파라미터가 전달됩니다.

// 01.프로퍼티 옵저버(Property Observers)
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"

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
iOS Developer

0개의 댓글