접근자 메소드를 자동으로 생성하는 기술입니다.
let
으로 생성했을 경우에는 getter
기능만 제공하는 것이고,
var
로 생성했을 경우에는 getter, (optional) setter
두 가지 기능을 모두 제공하는 것입니다.
Enum
에서 사용 불가능var
를 사용합니다.newValue
로 setter
에서 새로운 값을 사용할 수 있습니다. (변수명 지정도 가능합니다)struct Timer {
let id: Int
let startTime: Date
var endTime: Date?
func elapsedTime() -> TimeInterval {
return Date().timeIntervalSince(startTime)
}
func isFinished() -> Bool {
return endTime != nil
}
// mutating이 없으면 오류 발생!!
// mutating 문구를 func 앞에 추가 해주어야 합니다.
mutating func setFinished() {
endTime = Date()
}
// 원하는 형태로 객체 초기화를 위해서는 별도의 초기화 메소드를 제공해야 합니다.
// -> 구조체가 자동으로 제공하는 초기화 메소드는 사용 불가능합니다.
init(id: Int, startTime: Date) {
self.id = id
self.startTime = startTime
}
}
var timer = Timer(id: 1, startTime: Date())
print(timer.elapsedTime())
sleep(2)
print(timer.elapsedTime())
timer.setFinished()
print(timer.isFinished())
내부의 속성을 변경하는 메소드는 반드시
mutating
으로 지정되어야 합니다.
var timer = Timer()
는 가변 객체이기 때문에, mutating method
를 호출할 수 있습니다.
let timer = Timer()
는 불변 객체이기 때문에, 내부의 속성을 변겨할 수 없습니다. 즉, mutating method
를 호출할 수 없습니다.
struct Timer {
let id: Int
let startTime: Date
var endTime: Date?
// Computed Property는 var를 사용해야 합니다.
// Getter만 제공할 경우에는 get을 생략해도 됩니다.
var elapsedTime: TimeInterval {
get {
return Date().timeIntervalSince(startTime)
}
}
var isFinished: Bool {
get {
return endTime != nil
}
set {
// newValue: 사용자가 전달한 값
if newValue {
endTime = Date()
} else {
endTiem = nil
}
}
}
init(id: Int, startTime: Date) {
self.id = id
self.startTime = startTime
}
}
var timer = Timer(id: 1, startTime: Date())
print(timer.elapsedTime)
sleep(2)
print(timer.elapsedTime)
timer.isFinished = true // 구조체의 경우에는 var에서만 수행 가능
print(tiemr.isFinished)