SwiftUI 디자인 원칙

Source of Truth

Derived Value

스크린샷 2024-05-22 오전 2.06.01.png

Dependency를 자동으로 관리

스크린샷 2024-05-22 오전 2.08.49.png

🔥 UIKit의 경우 데이터를 암시적 종속성이 생기게 됨

→ 데이터가 변경되면 이를 바라보는 View에 새로운 값을 반영하도록 업데이트하기 때문에 오류가 날 수 있음

→ 위 사진처럼 Dependency를 관리하는 것은 어렵다

🍀 SwiftUI는 Derived Value를 계산하여 종속성을 자동으로 관리하기 때문에 이러한 오류가 나지 않음

Dependency 관리 실패의 예시

스크린샷 2024-05-22 오전 2.14.48.png

🤪 SwiftUI는 body만 구현하면 돼 짱이지?

frame을 사용하여 투명 뷰 생성 → 뷰의 사이즈를 조정

struct RoomDetail: View {
		let room: Room
		@State private var zoomed = false
		
		var body: some View {
				ZStack(alignment: .topLeading) {
						Image(room.imageName)
								.resizable()
								.aspectRatio(contentMode: zoomed ? .fill: .fit)
								.navigationBarTitle(Text(room.name), displayMode: .inline)
								.tapAction {
										// animation duration을 줄 수 있음
										withAnimation(.basic(duration: 2)) { self.zoomed.toggle() }
								}
								// 투명 frame을 깔아서 Image의 범위를 늘림
								.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
								
						Image(systemName: "video.fill")
								.font(.title)
								.padding(.all)
								// 애니메이션 transition과 동일
								.transition(.move(edge: .leading))
				}
		}
}

스크린샷 2024-05-22 오전 2.30.03.png