Slide 1

Slide 1 text

ZJNBKP 4XJGU͔Βͷ0CTFSWBUJPO͸ J04ະຬ͔Β΋࢖͑ͯ TUSVDUͷมߋݕ஌΋Ͱ͖ΔΜ͔͢Ͷʁ

Slide 2

Slide 2 text

ࣗݾ঺հʹ͔͑ͯ w α΢φ෇͖ͷϚϯγϣϯ͕͋Μ·Γͳ͍ w α΢φ෇͖ͷΪʔΫϚϯγϣϯʢখʣΛݐ͍ͯͨ w ԯ͘Β͍͍ͩ͘͞

Slide 3

Slide 3 text

ࣗݾ঺հʹ͔͑ͯ w α΢φ෇͖ͷϚϯγϣϯ͕͋Μ·Γͳ͍ w α΢φ෇͖ͷΪʔΫϚϯγϣϯʢখʣΛݐ͍ͯͨ w ԯ͘Β͍͍ͩ͘͞

Slide 4

Slide 4 text

ຊ୊ ࠷ۙͷษڧձͱ͔ͷࢿྉͰʜ

Slide 5

Slide 5 text

ʮ4XJGUҎ্ͷ0CTFSWBUJPOͰ͸ J04Ҏ্͔ͭDMBTT͡Όͳ͍ͱมߋ Λݕ஌Ͱ·ͤΜʯ

Slide 6

Slide 6 text

ؒҧͬͯ͸͍ͳ͍͕ɺ J04Ҏ߱ͱ͔ ͦΕຊ౰ͷ͜ͱͳΜͰ͔͢ʁ

Slide 7

Slide 7 text

࣮ࡍ͸ 4XJGUҎ্ͳΒ J04Ҏ্Ͱͳͯ͘΋ʢJ04Ҏ্ͳΒʣ 4XJGU6*Ͱ0CTFSWBUJPO͸࢖͑Δ͠ TUSVDUͷ؂ࢹ΋Ͱ͖ʜΔ

Slide 8

Slide 8 text

࣮ࡍ͸ 4XJGUҎ্ͳΒ J04Ҏ্Ͱͳͯ͘΋ʢJ04Ҏ্ͳΒʣ 4XJGU6*Ͱ0CTFSWBUJPO͸࢖͑Δ͠ TUSVDUͷ؂ࢹ΋Ͱ͖ʜΔ ϋϐϋϐϋοϐʔ🎵 ϋοϐʙ

Slide 9

Slide 9 text

·ͣ 0CTFSWBUJPOͷ࢓૊Έͱ͸ʁ

Slide 10

Slide 10 text

func renderCars() { var car1 = .init() var car2 = .init() withObservationTracking { print(car1.name) print(car2.name) } onChange: { } } XJUI0CTFSWBUJPO5SBDLJOH @PO$IBOHF 044ͳBQQMFTXJGUΛਅࣅͯ͠ɺόοΫϙʔτΛ࡞ΕΔ

Slide 11

Slide 11 text

func renderCars() { var car1 = .init() var car2 = .init() withObservationTracking { print(car1.name) print(car2.name) } onChange: { } } 0CTFSWBUJPO3FHJTUSBS 0CTFSWBUJPO3FHJTUSBS access XJUI0CTFSWBUJPO5SBDLJOH @PO$IBOHF 044ͳBQQMFTXJGUΛਅࣅͯ͠ɺόοΫϙʔτΛ࡞ΕΔ

Slide 12

Slide 12 text

func renderCars() { var car1 = .init() var car2 = .init() withObservationTracking { print(car1.name) print(car2.name) } onChange: { } } 0CTFSWBUJPO3FHJTUSBS 0CTFSWBUJPO3FHJTUSBS access @"DDFTT-JTU @"DDFTT-JTU addAccess XJUI0CTFSWBUJPO5SBDLJOH @PO$IBOHF 044ͳBQQMFTXJGUΛਅࣅͯ͠ɺόοΫϙʔτΛ࡞ΕΔ

Slide 13

Slide 13 text

func renderCars() { var car1 = .init() var car2 = .init() withObservationTracking { print(car1.name) print(car2.name) } onChange: { } } 0CTFSWBUJPO3FHJTUSBS 0CTFSWBUJPO3FHJTUSBS access merge @"DDFTT-JTU @"DDFTT-JTU addAccess XJUI0CTFSWBUJPO5SBDLJOH @PO$IBOHF 044ͳBQQMFTXJGUΛਅࣅͯ͠ɺόοΫϙʔτΛ࡞ΕΔ

Slide 14

Slide 14 text

func renderCars() { var car1 = .init() var car2 = .init() withObservationTracking { print(car1.name) print(car2.name) } onChange: { } } 0CTFSWBUJPO3FHJTUSBS 0CTFSWBUJPO3FHJTUSBS access merge @"DDFTT-JTU @"DDFTT-JTU addAccess XJUI0CTFSWBUJPO5SBDLJOH @PO$IBOHF 044ͳBQQMFTXJGUΛਅࣅͯ͠ɺόοΫϙʔτΛ࡞ΕΔ

Slide 15

Slide 15 text

DMBTTͷมߋΛݕ஌͢Δࡍʹ "DDFTT-JTUʹ৘ใΛ౉ͯ͠ݕ஌͞Εͨ ΋ͷ͕Կ͔͕Θ͔Δ IUUQTRJJUBDPNZJNBKPJUFNTCCDE

Slide 16

Slide 16 text

ͳͥ"QQMF͸J04Ҏ্ ͱ͍ͯ͠Δͷ͔

Slide 17

Slide 17 text

J04Ҏ্ͷλʔήοτʹݶఆ͞Ε͍ͯΔ͔Β ʢNBD04 J04 XBUDI04 UW04ʣ w XJUI0CTFSWBUJPO5SBDLJOH @PO$IBOHF w 0CTFSWBUJPO3FHJTUSBS

Slide 18

Slide 18 text

BQQMFTXJGUϦϙδτϦʹίʔυ͸͋Δ w XJUI0CTFSWBUJPO5SBDLJOH @PO$IBOHF w IUUQTHJUIVCDPNBQQMFTXJGUCMPCTXJGU3&-&"4&TUEMJC QVCMJD0CTFSWBUJPO4PVSDFT0CTFSWBUJPO 0CTFSWBUJPO5SBDLJOHTXJGU-- w 0CTFSWBUJPO3FHJTUSBS w IUUQTHJUIVCDPNBQQMFTXJGUCMPCTXJGU3&-&"4&TUEMJC QVCMJD0CTFSWBUJPO4PVSDFT0CTFSWBUJPO0CTFSWBUJPO3FHJTUSBSTXJGU

Slide 19

Slide 19 text

ͦͷ··ਅࣅͨ͠Β0CTFSWBUJPO࡞ΕΔΜ͡ΌͶʁ w όοΫϙʔτͳϥΠϒϥϦ w QPJOUGSFFDPTXJGUQFSDFQUJPO w IUUQTHJUIVCDPNQPJOUGSFFDPTXJGUQFSDFQUJPO w ଞʹ΋ w POFWDBU0CTFSWBUJPO#1 w IUUQTHJUIVCDPNPOFWDBU0CTFSWBUJPO#1

Slide 20

Slide 20 text

func renderCars() { var car1 = .init() var car2 = .init() withPerceptionTracking { print(car1.name) print(car2.name) } onChange: { } } @"DDFTT-JTU 0CTFSWBUJPO3FHJTUSBS @"DDFTT-JTU 0CTFSWBUJPO3FHJTUSBS access merge addAccess XJUI1FSDFQUJPO5SBDLJOH @PO$IBOHF PO$IBOHF͸ܧଓతʹಈ࡞͢ΔΘ͚͡Όͳ͍

Slide 21

Slide 21 text

XJUI1FSDFQUJPO5SBDLJOH @PO$IBOHF IUUQTHJUIVCDPNQPJOUGSFFDPTXJGUQFSDFQUJPOCMPCNBJO4PVSDFT1FSDFQUJPO1FSDFQUJPO5SBDLJOHTXJGU-$-

Slide 22

Slide 22 text

withPerceptionTracking { } onChange: { } XJUI1FSDFQUJPO5SBDLJOH @PO$IBOHF withObservationTracking { } onChange: { } 0CTFSWBUJPO ࢖͑Δ ࢖͑ͳ͍ 0CTFSWBUJPO3FHJTUSBS "DDFTT-JTU 0CTFSWBUJPO

Slide 23

Slide 23 text

͜͜·Ͱͷ·ͱΊ "QQMFެࣜͰͳ͍#BDL1PSU͞Εͨ΋ͷͳΒ͹ J04͔Β࢖͑Δʢ4XJGUҎ߱͸ඞਢʣ

Slide 24

Slide 24 text

4XJGU6*ͷ7JFX͕0CTFSWBUJPO ʹैͬͯ࠶ඳը͞ΕΔ݅

Slide 25

Slide 25 text

#BDL1PSUΛ࢖ͬͯ΋4XJGU6*Ͱͦͷ··࢖͑ΔΘ͚͡Όͳ͍ w มߋΛݕ஌͢Δ͜ͱͱ4XJGU6*7JFX ͕࠶ඳը͞ΕΔ݅͸ผ w TXJGUQFSDFQUJPOΛ4XJGU6*Ͱ࢖ ͏࣌͸8JUI1FSDFQUJPO5SBDLJOH Λ࢖͏ struct SomeView: View { var car = … var body: Some View { WithPerceptionTracking { Text(car.name) } } }

Slide 26

Slide 26 text

4XJGU0CTFSWBUJPO͸ DMBTTʹ͔͠࢖͑ͳ͍

Slide 27

Slide 27 text

࠷ॳʹ݁࿦ʢ͋͘·Ͱ༧૝ʣ

Slide 28

Slide 28 text

TUSVDU͕"DDFTT-JTUΛ༻͍ͯͦͷมߋΛ௨ ஌͞ΕΕ͹XJUI0CTFSWBUJPO PO$IBOHF ͸ಈ࡞͢ΔͩΖ͏͔Βɺճ͚ͩಈ͖͑͢͞ Ε͹͍͍ͷͰ͋Ε͹ͦΕ͸͓ͦΒ͘Մೳɻ

Slide 29

Slide 29 text

ͦΕ͸Ͱ͖Δ͕ɺ͓ͦΒ͘ɺ 4XJGU6*7JFXΛ࢖͏࣌TUSVDUͷΑ͏ʹίϐʔ͞ΕΔ ΋ͷ͸มߋ͞Εͨ஋ͷՕॴͷ7JFXͷΈߋ৽ͱ͍͏͜ͱ Λ܁Γฦ͠ߦ͑ͳ͍ʢ͸ͣʣ

Slide 30

Slide 30 text

func render() { withObservationTracking { } onChange: { } } ཧղͷͨΊɺXJUI0CTFSWBUJPO5SBDLJOHͰ4XJGU6*ߋ৽͢ΔΠϝʔδ struct SomeView: View { let car = … var body: Some View { Text(“\(car.name)”) FooView() { // userΛมߋ } } } ༧૝جຊͱͯ͠͸4XJGU6*ͷ֘౰7JFXҎԼΛߋ৽͍ͨ͠ɻ ͔͠͠TUSVDUͷมߋͰίϐʔ͞ΕҰҙੑ͕ͳ͘ͳΔͱɺ֘౰7JFXΛݟ͔ͭΒͳ͍ͷͰߋ৽Ͱ͖ͳ͍ɻ "DDFTT-JTUʹ͸7JFXͷ໊લΛอ͍࣋ͯ͠ΔΘ͚͡Όͳ͍ɻ

Slide 31

Slide 31 text

جຊ TUSVDUͷϓϩύςΟ΁ͷTFU͕ΞΫηαಈ࡞͠TFU͞Εͨ ΋ͷ͕TFU͞ΕΔલͷ΋ͷͱ͸ผ෺ͱͯ͠ίϐʔ͞ΕΔɻ ʢJOPVUͳTUSVDU͸@NPEJGZΞΫηα͕ಈ࡞͠ίϐʔ͸ ͞Εͳ͍ʣɻ

Slide 32

Slide 32 text

ͭ·ΓɺTUSVDUʹ!0CTFSWBCMFϚΫϩ Λར༻Ͱ͖ͯ͠·͏ͱɺ4XJGU6*ͰࠔΔ ͷͰͦ΋ͦ΋DMBTTͷΈʹ͞Ε͍ͯΔɻ

Slide 33

Slide 33 text

͡Ό͋TUSVDU͸0CTFSWBUJPOͰ ࢖͑ͳ͍ͷ͔ʁ

Slide 34

Slide 34 text

਌͕!0CTFSWBCMFDMBTTͳΒྑ͍ɻ ͦͷDMBTTͷϓϩύςΟʹTUSVDUͳ΋ ͷ͕͋Δͱ͢ΔɻTUSVDUͰ͋Δϓϩύς Οͷมߋ͸ͦͷ਌ͷΦϒδΣΫτͷมߋ ͱͯ͠ݕ஌Ͱ͖Δɻ @Observable class Car { struct Engine { var name = “V8” } @ObservationTracked var name = String() @ObservationTracked var engine = Engine() } DBSFOHJOFOBNFΛม͑ͯ΋ɺFOHJOFࣗମ͕ίϐʔ͞ΕΔɻ ݕ஌͸Ͱ͖͍ͯΔ͕OBNF͚ͩͷมߋʹͱͲ·͍ͬͯͳ͍ɻ

Slide 35

Slide 35 text

͔͠͠ TUSVDUࣗମͷมߋΛݕ஌͍ͨ͠

Slide 36

Slide 36 text

IUUQTHJUIVCDPNQPJOUGSFFDPTXJGUDPNQPTBCMFBSDIJUFDUVSF 5IF$PNQPTBCMF"SDIJUFDUVSF @ObservableState struct State { @ObservationStateTracked var name = “” } QPJOUGSFF public protocol ObservableState: Perceptible { var _$id: ObservableStateID { get } mutating func _$willModify() } IUUQTXXXQPJOUGSFFDPFQJTPEFTFQPCTFSWBCMF BSDIJUFDUVSFTUSVDUVSBMJEFOUJUZ

Slide 37

Slide 37 text

·ͱΊ wJ04ະຬͰ΋ެࣜͰͳ͍0CTFSWBUJPO͸࢖͑Δ wDMBTT͕อ࣋͢ΔTUSVDU΋ݕ஌͸Ͱ͖Δ wͨͩTUSVDUͷߏ଄ͷมԽΛݕ஌ͱ͍͏͔TUSVDUࣗମͷೖΕସΘΓΛݕ஌ w5$"ͳΒJ04ະຬ͔ͭTUSVDUͷத਎ͷมԽͰ΋มߋݕ஌Ͱ͖Δ