View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 주제
  • 전체 비디오
  • 소개

더 많은 비디오

스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.

  • 소개
  • 코드
  • SwiftUI의 Observation 알아보기

    Observation을 통해 SwiftUI 데이터 모델을 단순화하세요. Observable 매크로는 모델을 단순화해 앱의 성능을 향상합니다. Observation과 매크로의 기초를 익히고 ObservableObject에서 Observable로 마이그레이션하는 방법을 확인하세요.

    챕터

    • 1:03 - What is Observation?
    • 4:23 - SwiftUI property wrappers
    • 7:34 - Advanced uses
    • 10:27 - ObservableObject

    리소스

      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC23

    • Swift 매크로 상세히 알아보기
    • Swift 매크로 작성하기
    • SwiftData 만나보기
    • SwiftData 자세히 살펴보기
    • SwiftData로 마이그레이션하기
    • SwiftData로 스키마 모델링하기
    • SwiftData로 앱 만들기
    • SwiftUI 성능 쉽게 이해하기
    • SwiftUI의 새로운 기능
  • 비디오 검색…
    Array
    • 1:26 - Using @Observable

      @Observable class FoodTruckModel {    
          var orders: [Order] = []
          var donuts = Donut.all
      }
    • 2:12 - SwiftUI property tracking

      @Observable class FoodTruckModel {    
        var orders: [Order] = []
        var donuts = Donut.all
      }
      
      struct DonutMenu: View {
        let model: FoodTruckModel
          
        var body: some View {
          List {
            Section("Donuts") {
              ForEach(model.donuts) { donut in
                Text(donut.name)
              }
              Button("Add new donut") {
                model.addDonut()
              }
            }
          }
        }
      }
    • 3:12 - SwiftUI computed property tracking

      @Observable class FoodTruckModel {    
        var orders: [Order] = []
        var donuts = Donut.all
  var orderCount: Int { orders.count }
      }
      
      struct DonutMenu: View {
        let model: FoodTruckModel
          
        var body: some View {
          List {
            Section("Donuts") {
              ForEach(model.donuts) { donut in
                Text(donut.name)
              }
              Button("Add new donut") {
                model.addDonut()
              }
            }
            Section("Orders") {
              LabeledContent("Count", value: "\(model.orderCount)")
            }
          }
        }
      }
    • 4:41 - Using @State

      struct DonutListView: View {
          var donutList: DonutList
          @State private var donutToAdd: Donut?
      
          var body: some View {
              List(donutList.donuts) { DonutView(donut: $0) }
              Button("Add Donut") { donutToAdd = Donut() }
                  .sheet(item: $donutToAdd) {
                      TextField("Name", text: $donutToAdd.name)
                      Button("Save") {
                          donutList.donuts.append(donutToAdd)
                          donutToAdd = nil
                      }
                      Button("Cancel") { donutToAdd = nil }
                  }
          }
      }
    • 5:14 - Using @Environment

      @Observable class Account {
        var userName: String?
      }
      
      struct FoodTruckMenuView : View {
        @Environment(Account.self) var account
      
        var body: some View {
          if let name = account.userName {
            HStack { Text(name); Button("Log out") { account.logOut() } }
          } else {
            Button("Login") { account.showLogin() }
          }
        }
      }
    • 6:27 - Using @Bindable

      @Observable class Donut {
        var name: String
      }
      
      struct DonutView: View {
        @Bindable var donut: Donut
      
        var body: some View {
          TextField("Name", text: $donut.name)
        }
      }
    • 7:53 - Storing @Observable types in Array

      @Observable class Donut {
        var name: String
      }
      
      struct DonutList: View {
        var donuts: [Donut]
        var body: some View {
          List(donuts) { donut in
            HStack {
              Text(donut.name)
              Spacer()
              Button("Randomize") {
                donut.name = randomName()
              }
            }
          }
        }
      }
    • 9:18 - Manual Observation

      @Observable class Donut {
        var name: String {
          get {
            access(keyPath: \.name)
            return someNonObservableLocation.name 
          }
          set {
            withMutation(keyPath: \.name) {
              someNonObservableLocation.name = newValue
            }
          }
        } 
      }

Developer Footer

  • 비디오
  • WWDC23
  • SwiftUI의 Observation 알아보기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    Apple Developer 앱 받기
    Copyright © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침