프로퍼티
접근자 메소드를 자동으로 생성하는 기술입니다.
let으로 생성했을 경우에는 getter 기능만 제공하는 것이고,
var로 생성했을 경우에는 getter, (optional) setter 두 가지 기능을 모두 제공하는 것입니다.
- Stored Property - 저장형 프로퍼티
- 단순히 값을 저장하고 있는 프로퍼티
- Enum 에서 사용 불가능
- Computed Property - 계산형 프로퍼티
- 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
내부의 속성을 변경하는 메소드는 반드시 mutating 으로 지정되어야 합니다.
- 가변객체
var timer = Timer() 는 가변 객체이기 때문에, mutating method를 호출할 수 있습니다.
- 불변객체
let timer = Timer() 는 불변 객체이기 때문에, 내부의 속성을 변겨할 수 없습니다. 즉, mutating method를 호출할 수 없습니다.
Computed Property로 기능을 제공할 경우
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)
반응형
'iOS > Swift' 카테고리의 다른 글
[Swift] Enum2 (0) | 2022.12.26 |
---|---|
[Swift] 상속 (0) | 2022.12.26 |
[Swift] Tuple (0) | 2022.12.26 |
[Swift] Enum (0) | 2022.12.26 |
[Swift] 문자열 (String) (0) | 2022.12.26 |