Slide 1

Slide 1 text

3FTPMWF/FTUFE0CTFSWBCMF0CKFDU JTTVFTJO0CTFSWBUJPO $ZCP[V.PCJMF.FFUVQ FMNFUBM$ZCP[V *OD

Slide 2

Slide 2 text

"CPVUNF !FM@NFUBM@ J04"QQ %FWFMPQFS J04ΞϓϦ։ൃ ڝഅ ରઓήʔϜ

Slide 3

Slide 3 text

/FTUFE0CTFSWBCMF0CKFDU

Slide 4

Slide 4 text

/FTUFE0CTFSWBCMF0CKFDU 8IBUBOJTTVFPG/FTUFE0CTFSWBCMF0CKFDU 0CTFSWBCMF0CKFDUΛϓϩύςΟʹ࣋ͭ0CTFSWBCMF0CKFDUͰมߋ͕௨஌͞Εͳ͍

Slide 5

Slide 5 text

final class Parent: ObservableObject { @Published var child: Child init(child: Child) { self.child = child } } final class Child: ObservableObject { @Published var age: Int init(age: Int) { self.age = age } func haveBirthday() { age += 1 } } /FTUFE0CTFSWBCMF0CKFDU 3FQSPEVDFUIFJTTVFPG0CTFSWBCMF0CKFDU

Slide 6

Slide 6 text

/FTUFE0CTFSWBCMF0CKFDU 3FQSPEVDFUIFJTTVFPG0CTFSWBCMF0CKFDU final class Parent: ObservableObject { @Published var child: Child init(child: Child) { self.child = child } } final class Child: ObservableObject { @Published var age: Int init(age: Int) { self.age = age } func haveBirthday() { age += 1 } } struct BirthdayView: View { @StateObject var parent = Parent(child: Child(age: 1)) var body: some View { Text("child is \(parent.child.age) years old") Button("Have Birthday", action: { parent.child.haveBirthday() }) } }

Slide 7

Slide 7 text

final class Parent: ObservableObject { @Published var child: Child private var cancellables = Set() init(child: Child) { self.child = child child.objectWillChange.sink { [weak self] in self?.objectWillChange.send() } .store(in: &cancellables) } } final class Child: ObservableObject { @Published var age: Int init(age: Int) { self.age = age } func haveBirthday() { age += 1 } } /FTUFE0CTFSWBCMF0CKFDU 'JYUIFJTTVFPG0CTFSWBCMF0CKFDU

Slide 8

Slide 8 text

final class Parent: ObservableObject { @Published var child: Child private var cancellables = Set() init(child: Child) { self.child = child child.objectWillChange.sink { [weak self] in self?.objectWillChange.send() } .store(in: &cancellables) } } final class Child: ObservableObject { @Published var age: Int init(age: Int) { self.age = age } func haveBirthday() { age += 1 } } struct BirthdayView: View { @StateObject var parent = Parent(child: Child(age: 1)) var body: some View { Text("child is \(parent.child.age) years old") Button("Have Birthday", action: { parent.child.haveBirthday() }) } } /FTUFE0CTFSWBCMF0CKFDU 'JYUIFJTTVFPG0CTFSWBCMF0CKFDU

Slide 9

Slide 9 text

/FTUFE!0CTFSWBCMF

Slide 10

Slide 10 text

@Observable final class Parent { var child: Child init(child: Child) { self.child = child } } @Observable final class Child { var age: Int init(age: Int) { self.age = age } func haveBirthday() { age += 1 } } /FTUFE!0CTFSWBCMF 8JMMUIFJTTVFCFSFQSPEVDFE

Slide 11

Slide 11 text

5IFJTTVFJTSFTPMWFE @Observable final class Parent { var child: Child init(child: Child) { self.child = child } } @Observable final class Child { var age: Int init(age: Int) { self.age = age } func haveBirthday() { age += 1 } } struct BirthdayView: View { @State var parent = Parent(child: Child(age: 1)) var body: some View { Text("child is \(parent.child.age) years old") Button("Have Birthday", action: { parent.child.haveBirthday() }) } } /FTUFE!0CTFSWBCMF

Slide 12

Slide 12 text

*OMJOF.BDSP

Slide 13

Slide 13 text

*OMJOF!0CTFSWBCMF.BDSP final class Child { @ObservationTracked var age: Int init(age: Int) { self.age = age } func haveBirthday() { age += 1 } @ObservationIgnored private let _$observationRegistrar = Observation.ObservationRegistrar() internal nonisolated func access( keyPath: KeyPath ) { _$observationRegistrar.access(self, keyPath: keyPath) } internal nonisolated func withMutation( keyPath: KeyPath, _ mutation: () throws -> MutationResult ) rethrows -> MutationResult { try _$observationRegistrar.withMutation(of: self, keyPath: keyPath, mutation) } } extension Child: Observation.Observable { }

Slide 14

Slide 14 text

*OMJOF!0CTFSWBUJPO5SBDLFE.BDSP final class Child { var age: Int{ @storageRestrictions(initializes: _age) init(initialValue) { _age = initialValue } get { access(keyPath: \.age) return _age } set { withMutation(keyPath: \.age) { _age = newValue } } } … }

Slide 15

Slide 15 text

4VNNBSZ

Slide 16

Slide 16 text

4VNNBSZ w 0CTFSWBCMF0CKFDUΛϓϩύςΟʹ࣋ͭ0CTFSWBCMF0CKFDUͰࢠڙͷมߋΛ௨஌ ͢Δʹ͸खಈͰPCKFDU8JMM$IBOHFͷTFOE͕ඞཁ w 0CTFSWBUJPOͰ͸0CTFSWBCMF0CKFDUͱҟͳΔ࢓૊ΈΛఏڙ͢Δ͜ͱͰ໰୊Λ ղܾͨ͠

Slide 17

Slide 17 text

*OUFSBDUJWF5VUPSJBMT /FTUFE0CTFSWBCMF0CKFDU IUUQTFMNFUBMHJUIVCJP0CTFSWBUJPO*O%FQUIUVUPSJBMTPCTFSWBUJPOJOEFQUIOFTUFEPCTFSWBCMFPCKFDU