학습 기록/swift

날짜 플래너: 데이터 모델 이해하기 및 동적 목록 생성하기

romi__ 2024. 10. 26. 20:44

📌Swift Playgrounds

 

 

📌 앱 구성

@StateObject private var eventData = EventData()

 

- 속성 래퍼

  • 변수를 좀 더 쉽게 선언하고 관리할 수 있도록 함: 변수를 관리하고 추적. @로 시작
  • 특정 작업을 자동으로 해주는 코드를 변수에 적용할 수 있게 됨

 

- @StateObject: 객체(위의 예문에서는 eventData)의 상태 변화를 뷰가 알 수 있도록 하고, 그 변화에 따라 화면을 업데이트

 

- private 접근 제어자: 변수를 현재 파일에서만 사용하도록 함

 

- 인스턴스: 특정 클래스(=설계도)로부터 만들어진 객체. 설계도(EventData)를 토대로 실제 사용 가능한 데이터 덩어리를 만드는 것

 

- 위의 예문을 해석해 보자면,

EventData라는 클래스의 인스턴스 EventData()를 eventData라는 이름의 객체(변수)로 만들고, SwiftUI가 객체의 상태 변화를 자동으로 추적하여 화면을 업데이트하게 해!

정도가 되겠다.

 

 

📌 이벤트 모델

//Identifiable 프로토콜에 따라 이벤트 목록을 작성하는 경우,
//SwiftUI는 각 행을 식별하고 업데이트 할 수 있습니다.

struct Event: Identifiable, Hashable, Codable

 

- 프로토콜?

  • 특정 기능, 속성(프로퍼티)이 클래스/구조체/열거형 같은 타입에 포함되어야 한다는 일종의 약속
  • 적용된다면 명시된 요구사항을 반드시 구현해야 한다.

 

struct Event: Identifiable {
    var id: UUID // 각 Event마다 고유한 식별자가 됩니다.
    var name: String
}

- Identifiable: 고유 식별자를 갖도록 하여 데이터 목록 관리에 유리하다.

 

struct Person: Hashable {
    var name: String
    var age: Int
}

- Hashable: 객체를 해시값으로 변환한다.

*해시값: 데이터를 고정된 길이의 숫자나 문자열로 변환한 값. 데이터의 빠른 검색이 가능하도록 한다.

위의 예시에서는 name, age를 바탕으로 고유의 해시값을 생성한다.

 

- Codable: 데이터의 인코딩, 디코딩을 돕는다. JSON 데이터로의 변환 혹은 JSON에서 객체를 만들기가 쉬워진다. 서버와 데이터를 주고받을 때 자주 사용한다.

 

 

📌 이벤트 데이터

//ObservableObject 프로토콜을 따르므로
//게시된 값이 변경되면
//SwiftUI는 자동으로 모든 관찰자에 알림을 보내고 보기를 업데이트

 

- ObservableObject: 데이터 변화를 추적한다. 데이터가 바뀔 때마다 SwiftUI가 자동으로 화면을 업데이트할 수 있다.

 

- @Published: 변수가 바뀔 때 자동으로 SwiftUI에 알림을 보내주도록 설정한다. ObservableObject와 함께 자주 쓰인다.

 

- 관찰자: 관찰 가능한 객체의 데이터를 사용하는 보기 내지는 객체

 

 

📌 이벤트 목록

struct ContentView: View {
    let fruits = ["Apple", "Banana", "Cherry"]

    var body: some View {
        List(fruits, id: \.self) { fruit in
            Text(fruit)
        }
    }
}

- List: 목록 표시용 기본 구성 요소

 

class EventData: ObservableObject {
    @Published var eventCount: Int = 0
}

struct ParentView: View {
    @StateObject var eventData = EventData() // ParentView에서 eventData를 생성

    var body: some View {
        ChildView(eventData: eventData) // ChildView로 전달
    }
}

struct ChildView: View {
    @ObservedObject var eventData: EventData // ParentView에서 전달된 eventData를 추적

    var body: some View {
        Text("Event Count: \(eventData.eventCount)")
    }
}

- @ObservedObject: 다른 뷰에서 만든 ObservableObject를 전달받아 사용한다. 어떤 뷰가 외부에서 전달된 데이터를 추적하도록 하는 속성 래퍼이다.

- 뷰?: 화면에 표시되는 모든 요소를 생성하고 구성하는 블록. 기본 뷰에는 Text, Image, Button, List, VStack, HStack, ZStack 등이 있다. 뷰는 계층 구조로, 각 뷰는 다른 뷰를 포함할 수 있다.

 

- NavigationSplitView: 다단계의 네비게이션을 제공한다. 사이드바, 컨텐츠, 디테일로 구성되어 있으며 다단계 탐색을 지원하고 화면 공간을 최적화하며 동적 UI를 제공한다는 장점이 있다.

 

List(selection : $selection) {
	ForEach (Period.allCases) {
    	period in
        	section(content : {
            	ForEach(eventData.sortedEvents(period: period)) {
                	$event in

 

- $: 바인딩을 나타내는 기호

  • 바인딩: 데이터의 변경 사항을 두 곳에서 동시에 반영할 수 있도록 함
  • 리스트에서 선택한 항목이 변경되면 selection 변수도 업데이트 되도록 하는 것

- section: SwiftUI에서 UI 구성 요소를 그룹화하는데 사용되는 뷰

- content: 섹션에 포함될 내용 정의

'학습 기록 > swift' 카테고리의 다른 글

날짜 플래너: 앱 데이터 지속화하기  (0) 2024.10.27
The Basics #1  (0) 2024.10.22
A Swift Tour - Object and Class 객체와 클래스  (0) 2024.10.15