안녕하세요!
오늘도 SwiftUI에 대해서 알아보겠습니다.
Swift 공식문서에는 Property Wrapper를 아래와 같이 설명 합니다.
A property wrapper adds a layer of separation between code that manages how a property is stored and the code that defines a property.
번역하면 "Property Wrapper는 프로퍼티가 저장되는 방법을 관리하는 코드와 프로퍼티를 정의하는 코드 사이의 계층을 추가한다."라는 뜻이라고 합니다.. 음.. 잘 이해는 안갑니다.. ㅎ
간단하게는 프로퍼티 래퍼를 쓰면 프로퍼티에 미리 정의해둔 연산을 사용하기 때문에 반복되는 코드를 줄일 수 있다는 장점이 있다고 합니다.
프로퍼티 래퍼에 대해서 제가 따로 공부해서 포스팅 하겠습니다!
일단은 SwiftUI에서 기본적으로 제공하는 프로퍼티 래퍼에 대해서 정리해보겠습니다.
struct ContentView: View {
@State private var isShowSecondaryView = false
var body: some View {
Text("Hello, world!")
.padding()
.onTapGesture {
self.isShowSecondaryView = true
}
.sheet(isPresented: $isShowSecondaryView, onDismiss: nil) {
SecondaryView(isShowTaskDetailView: $isShowSecondaryView)
}
}
}
isShowTaskDetailView
을 바인딩하여 값을 false
로 바꾸어 뷰를 닫습니다.struct SecondaryView: View {
@Binding var isShowTaskDetailView: Bool
var body: some View {
Button("닫기") {
self.isShowTaskDetailView = false
}
}
}
// SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else {
return
}
// 공유할 인스턴스 생성
let taskViewModel = TaskListViewModel()
// 위에서 생성한 인스턴스를 첫 뷰의 environmentObject로 설정
let contentView = ProjectManagerMainView().environmentObject(taskViewModel)
let window = UIWindow(windowScene: windowScene)
// root뷰 설정
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
// @EnvironmentObject를 사용하여 선언
struct ProjectManagerMainView: View {
@EnvironmentObject private var taskListViewModel: TaskListViewModel
}
감사합니다!