Bindable은 프로퍼티 래퍼 타입으로 observable 객체인 변경 가능한 프로퍼티들을 binding으로 만듭니다
Bindable 프로퍼티 래퍼는 Observable 프로토콜을 준수하는 데이터 모델 객체의 변경 가능한 프로퍼티에 대한 바인딩을 생성할 때. 사용합니다. 예를 들어 다음과 같이 book을 @Bindable 프로퍼티 래퍼로 만들어 줍니다. 다음으로 TextField를 통해 Book의 title 프로퍼티를 바꿉니다. 추가로 $를 붙여서 바인딩을 붙이게 되면 변경된 데이터를 참조해 바꿔줍니다.
@Observable
class Book: Identifiable {
var title = "Sample Book Title"
var isAvailable = true
}
struct BookEditView: View {
@Bindable var book: Book
@Environment(\.dismiss) private var dismiss
var body: some View {
Form {
TextField("Title", text: $book.title)
Toggle("Book is available", isOn: $book.isAvailable)
Button("Close") {
dismiss()
}
}
}
}
이 Bindable 프로퍼티 래퍼는 Observable 객체의 프로퍼티와 변수들에 사용할 수 있습니다. 이것은 전역 변수와 SwiftUI 타입 밖에 존재하는 프로퍼티들과 지역 변수에도 마찬가지로 포함됩니다. 예를 들어 만약 view의 body에서 @Bindable 변수를 만드는 예시입니다.
struct LibraryView: View {
@State private var books = [Book(), Book(), Book()]
var body: some View {
List(books) { book in
@Bindable var book = book
TextField("Title", text: $book.title)
}
}
}
@Bindable 변수인 book은 사용자가 모델 데이터를 직접 변경할 수 있도록 TextField를 책의 제목 속성에 연결하는 바인딩을 제공합니다.
이런 접근방식은 view의 environment에 저장되어 있는 observable object를 바인딩해야할 때 사용됩니다. 예를 들어 다음 코드는 Environment 프로퍼티 래퍼를 사용하여 observable 타입인 Book의 객체를 가져오는 코드입니다. 그런 다음 코드는 @Bindable 변수인 book을 만들어 TextField에 $를 사용하여 바인딩을 할 수 있게 됩니다.
struct TitleEditView: View {
@Environment(Book.self) private var book
var body: some View {
@Bindable var book = book
TextField("Title", text: $book.title)
}
}
struct MainApp: View {
@State(Book.self) private var book
var body: some Scene {
WindowGroup {
TitleEditView()
.environment(book)
}
}
}
결론
@Bindable 프로퍼티 래퍼를 사용하게 되면 @Environment 프로퍼티 래퍼의 프로퍼티 같은 경우에도 바인딩하여 값을 사용할 수 있습니다.
'SwiftUI' 카테고리의 다른 글
Custom RoundedRectangle (0) | 2024.04.02 |
---|---|
SwiftUI - 클래스 간 데이터 교환, 의존성 주입 (0) | 2024.03.27 |
Referencing instance method 'setValue(forKey:to:)' on 'Optional' requires that conform to 'PersistentModel' (0) | 2024.03.18 |
SwiftData 로 영구저장하기 (0) | 2024.03.18 |
WCSession 애플워치 아이폰 간 데이터 전송 (0) | 2024.03.14 |