데이터 흐름 이해하기

기존 방식과 다르게 SwiftUI에서는 데이터를 변경하고 전달하는 방식이 달라졌습니다.

프로퍼티 값 수정하기

버튼을 누르면 UIKit이라고 되어있는 버튼을 SwiftUI로 변경하는 코드가 있다고 가정 해보겠습니다.

Untitled

구조체 연산 프로퍼티의 getter 기본 속성이 nonmutating이라서 변경 할 수 없습니다.

SwiftUI에서는 뷰에서 어떤 상태를 저장하고 수정하는 방법으로 @State, @Binding과 같은 새로운 도구를 제공합니다.

struct ContentView: View {
    @State private var framework: String = "UIKit"
    var body: some View {
        Button(framework) {
            self.framework = "SwiftUI"
        }
    }
}

데이터 흐름의 2가지 원칙

데이터 의존성

뷰는 데이터가 변경될 때마다 값을 반영해야 하므로 데이터에 대한 의존성을 가집니다.

// count 값이 변경되면 뷰에 변경 정보를 반영
var count = 0 {
		didSet { countLable.text = "\\(count)" }
}

// 새로운 데이터가 추가되면 UITableView 갱신
func appendData() {
		data.append("New Data")
		tableView.reloadData()
}

위 처럼 데이터가 추가 될 때 마다 ui를 갱신해야 하는 코드가 있는데 이런 작업을 수작업으로 하다보면 개발자가 실수할 가능성이 있습니다.

단일 원천 자료(Single Source of Truth)

뷰가 참조하는 데이터는 단일 원천 자료여야 합니다.

SwiftUI는 데이터를 크게 원천 자료와 파생 자료(Derived data)로 구분합니다.

struct SuperView: View {
		let name = "홍길동"
		var body: some View { SubView(name: name) }
}

struct SubView: View {
		let name: String
		var body: some View { Text("\\(name)") }
}