일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Delegate Pattern
- WWDC22
- widgetkit
- watchkit
- swift concurrency
- app intents
- createml
- Apple Developer Academy
- task.yield()
- github
- UIStackView
- ios
- coreml
- Sendbird
- Flutter
- UITableView
- Tuist
- spring
- Project
- Firebase
- Complication
- 코테
- cloud functions
- tabman
- SwiftUI
- fcm
- Coding Test
- Swift
- backend
- UIDatePicker
- Today
- Total
azhy의 iOS 이야기
[iOS] get, set, didSet, willSet 본문
2022년 7월 8일에 작성됨
get, set
get, set이라고 하면 흔히 생각이 들고 자주 봤었던 getter, setter라고 생각할 수 있습니다.
사용하는 방법과 이유가 거의 유사합니다. swift에서는 get, set을 묶어 연산 프로퍼티라고 부르죠. 사용법을 간단히 먼저 알아봅시다.
class Demo {
// get, set을 사용하기 위해서는 그 연산된 값을 저장할 변수가 반드시 있어야한다.
var _value : Int = 1
// value의 역할은 _value에 대해서 값을 연산하여 value에 할당하거나 리턴하는 역할만 한다.
var value: Int {
get {
return _value
}
set(newValue) {
_value = newValue * 2
}
}
}
코드를 보면 따로 get, set 에 사용하는 값을 _value라는 따로 변수를 만들었습니다.
만약 get, set 에 따로 변수를 만들어서 사용하지 않고 value로 접근하면 xcode 에서 경고창을 띄웁니다.
그래서 우리는 사용할 때 따로 변수를 하나 만들어서 사용하도록 합시다.
didSet, willSet
사실 이번 글을 쓰는 목적이자 개인적으로 신기했던 친구입니다. didSet과 willSet은 프로퍼티 값의 변경 직전과 직후를 감지하여 그 시점에 작업을 진행할 수 있게 해주는 굉장한 기능을 가졌습니다.
그래서 보통 model에서의 변경사항을 view에 반영해야하는 일이 있으면 자주 쓰입니다.
예를 들어 어떤 모델에 대한 값을 변경하고 그 값을 label에 세팅해 주는 과정을 거친다고 생각해 봅시다.
var tempValue = "값 변경 전"
tempValue = "값 변경 후"
label.text = tempValue
이렇게 진행해도 아무 문제는 없습니다. 하지만 이런 과정들이 하나 둘 늘어나면 코드도 길어지고 복잡해지는 건 분명하죠.
var tempValue: String = "값 변경 전" {
willSet (newValue) {
print("willSet, \(tempValue) -> \(newValue) , 변경 예정")
}
didSet (oldValue) {
print("didSet, \(oldValue) -> \(tempValue) , 변경 완료")
// view 갱신에 관한 코드를 willSet, didSet 본인이 필요한 곳에 넣어주면 된다.
label.text = tempValue
}
}
tempValue = "값 변경 후"
// willSet, 값 변경 전 -> 값 변경 후 , 변경 예정
// didSet, 값 변경 전 -> 값 변경 후 , 변경 완료
이렇게 작성하면 didSet과 willSet을 이용하면 값이 변경하는 그 순간을 감지하기 때문에 View에 관한 갱신하는 작업을 따로 할 필요가 없습니다.
willSet: 프로퍼티의 값이 변경되기 직전에 호출되는 옵저버
프로퍼티 값이 변경되기 전에 처리해야 하는 일이 있으면 willSet을 이용해서 처리하면 됩니다.
didSet: 프로퍼티의 값이 변경된 직후에 호출되는 옵저버
프로퍼티 값이 변경된 후에 처리해야 할 일이 있으면 didSet을 이용해서 처리하면 됩니다.
'iOS' 카테고리의 다른 글
[iOS] swift, Error Domain=NSCocoaErrorDomain Code=4099~ 해결법 (0) | 2024.11.12 |
---|---|
[iOS] Struct와 Class 의 공통점과 차이점 (0) | 2024.11.12 |
[iOS] 원티드 프리온보딩 사전과제 연습 후기 (0) | 2024.11.11 |
[iOS] Font 추가하기 (2) | 2024.11.11 |
[iOS] github에 API Key 숨기기 (0) | 2024.11.11 |