Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Observable
- UICollectionView
- MVVM
- 스위프트
- ribs
- UITextView
- tableView
- Human interface guide
- clean architecture
- Refactoring
- swift documentation
- 리펙토링
- collectionview
- SWIFT
- uitableview
- 애니메이션
- Clean Code
- rxswift
- map
- RxCocoa
- swiftUI
- combine
- ios
- Xcode
- Protocol
- 클린 코드
- uiscrollview
- 리팩토링
- 리펙터링
- HIG
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - SwiftUI] ObservableObject, @Published, obejctWillChanged, @ObservedObject, @State 개념 정리 본문
iOS 응용 (SwiftUI)
[iOS - SwiftUI] ObservableObject, @Published, obejctWillChanged, @ObservedObject, @State 개념 정리
jake-kim 2024. 8. 16. 01:32ObservableObjec, @Published, objectWillChanged 개념
- ObservableObject는 옵저빙 될 수 있는 모델을 의미
- 옵저빙 된다는 의미는 값이 변경되었을때, 이 모델을 옵저빙하고 있는 대상에게 알림을 주는 것
- 변경된다는 기준은 @Publihsed 키워드로 선언된 프로퍼티가 변경되었을때 알림을 줌
- @Published를 사용하면 objectWillChanged라는 내부 프로퍼티에 send()를 날리는 것과 동일
class User: ObservableObject {
let name = "name"
/// @Published: 변경되었다는 기준이 될 property에 선언
@Published var score = 0
/* objectWillChanged에 send()하면 변경되었다고 알려주는 것인데, @Published를 사용하면 아래 코드가 자동으로 처리되는 것
let objectWillChanged = ObejctWilLChangePublisher()
var score = 0 {
willSet { objectWillChanged.send() }
}
*/
}
@ObservedObject와 @State 차이
- @ObservedObject는 ObservableObject를 준수한 모델을 옵저빙 할 때 쓰는 키워드
struct ContentView: View {
/// @ObservedObject: 뷰에서 OservableObject 모델을 사용하려면 @ObservedObject키워드 선언이 필요
@ObservedObject var user: User
var body: some View {
VStack {
Text(user.name)
Button(action: { self.user.score += 1 }) {
Text(user.score.description)
}
}
.padding()
}
}
- @State는 뷰 내부에서만 옵저빙하는 상태값을 사용할 때만 사용
ex) @State 예제
struct ContentView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Button clicked \(count) times")
.font(.largeTitle)
.padding()
Button(action: {
count += 1
}) {
Text("Click me!")
.font(.title)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
}
}
}
- 뷰 내부에서만 사용해야 안전하므로, 애플 문서에서도 private 사용을 권장함
* 참고
'iOS 응용 (SwiftUI)' 카테고리의 다른 글
Comments