var 변수명: 타입 {
willSet(새로운값) {
// 새로운 값이 저장되기 직전에 실행할 코드
}
didSet {
// 새로운 값이 저장된 후에 실행할 코드
}
}
willSet
: 프로퍼티를 관찰(observe)하다가 새 값이 저장되기 직전에 실행되며,newValue
라는 이름으로 새로운 값에 접근할 수 있다.didSet
: 프로퍼티를 관찰(observe)하다가 새 값이 저장된 직후에 실행되며,oldValue
라는 이름으로 이전 값에 접근할 수 있다.willSet
의 newValue
, didSet
의 oldValue
는 각각 직접 정의할 수도 있음willSet
, didSet
이 필요 없을 때가 많다.var myProperty: Int = 20{
didSet(oldValue){
print(oldValue)
}
willSet(newValue){
print(newValue)
}
}
var name: String = "Unknown" {
willSet {
print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
}
didSet {
print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
}
}
name = "Peter"
// willSet이 먼저 실행
// 현재 이름 = Unknown, 바뀔 이름 = Peter
// 현재 이름 = Peter, 바뀌기 전 이름 = Unknown
접근 제한자(Access Control)는 Swift에서 클래스, 구조체, 열거형, 프로토콜, 그리고 그 안의 프로퍼티 및 메소드의 접근 권한을 정의하는 방법이다. 데이터 은닉과 모듈화를 강화하고, 코드의 유지보수성을 높일 수 있다.
// 다른 모듈에서도 사용 가능
open class Animal {
open func makeSound() {
print("Animal sound")
}
}
class Dog: Animal {
override func makeSound() {
print("Bark")
}
}
public
으로 설정할 수 있다.public
메소드는 해당 클래스를 상속하더라도 (위의 Dog
클래스처럼은) 오버라이드할 수 없다.public class Cat {
public func meow() {
print("Meow")
}
}
internal
로 설정된다.class Fish {
func swim() {
print("Swim")
}
}
class Car {
private var engine: String = "V8"
private func startEngine() {
print("Engine started")
}
func drive() {
startEngine() // 접근 가능
}
}
let myCar = Car()
// myCar.engine // 오류: 'engine'은 private이므로 접근 불가
// myCar.startEngine() // 오류: 'startEngine'은 private이므로 접근 불가
문제 풀이는 다음 글에서