Slide 1

Slide 1 text

4XJGU6*Ή͚ʹ ੔ཧ͞Εͨঢ়ଶ؂ࢹ 0CTFSWBUJPO ೳొཁ !OPUPSPJE J1IPOFΞϓϦ։ൃऀ೥݄೔

Slide 2

Slide 2 text

࠷ۙͷ׆ಈ 4XJGU6*Λཧղ͢ΔͨΊʹ4XJGUݴޠͷڍಈʹ͍ͭͯ࿩͢͜ͱ͕ଟ͠ w Αͤ͋ͭΊ4XJGU4XJGU4QFBLFS%FDL w IUUQTTQFBLFSEFDLDPNOPUPSPJEZPTFBUVNFTXJGUTXJGUEPU w "QQMF͕ ΍Γ͍ͨ์୊4XJGU"UUSJCVUFT4QFBLFS%FDL w IUUQTTQFBLFSEFDLDPNOPUPSPJEBQQMFHBZBSJUBJGBOHUJTXJGU BUUSJCVUFT w 4XJGU6*͕؆ܿʹهड़Ͱ͖ΔΑ͏ʹͳΔ΄Ͳ4XJGUݴޠͱัଊػೳ͕ෳࡶԽ ͍ͯ͠Δ

Slide 3

Slide 3 text

࿩͢಺༰ w 4PVSDFPGUSVUI w $PNCJOFͱ0CTFSWBUJPOͷهड़ํ๏ൺֱ w 0CTFSWBUJPOͷૂ͍ w 0CTFSWBUJPOΛ࣮ݱՄೳͱ͍ͯ͠Δٕज़

Slide 4

Slide 4 text

࿩͞ͳ͍಺༰ w σʔλόΠϯσΟϯά !#JOEJOH w $PNCJOFͱ0CTFSWBUJPOͷ૬ޓӡ༻ w 0CTFSWBUJPOͷखಈ࣮૷

Slide 5

Slide 5 text

͓୊໨ w 4XJGU6*प೥ w هड़ํ๏ൺֱ$PNCJOFͱ0CTFSWBUJPO w 0CTFSWBUJPOͷૂ͍ w ·ͱΊ

Slide 6

Slide 6 text

4XJGU6*प೥

Slide 7

Slide 7 text

4XJGU6*प೥ ϚϧνϓϥοτϑΥʔϜରԠͷ6*ϑϨʔϜϫʔΫ w 6*पΓͷॆ࣮ "OJNBUJPO 8JEHFU w 4XJGU6*Λࢧ͑Δ࢓૊ΈͰ͋Δঢ়ଶ؂ࢹʹ͍ͭͯେ͖ͳΞοϓσʔτ w ʙ$PNCJOFGSBNFXPSLΛ࢖ͬͨঢ়ଶ؂ࢹΛ4XJGU6*ͱ૊Έ߹Θͤ w ʙ0CTFSWBUJPOGSBNFXPSLΛ࢖ͬͨঢ়ଶ؂ࢹͱ૊Έ߹ΘͤΔ

Slide 8

Slide 8 text

0CTFSWBUJPOGSBNFXPSL "QQMFۘ੡σʔλ؍ଌϑϨʔϜϫʔΫ w J04Ҏ߱ରԠ w ։ൃπʔϧ9DPEFҎ߱ w $PNCJOFGSBNFXPSL ʙ ͷ୅ΘΓʹ4XJGU6*Ͱར༻Ͱ͖Δ w 4XJGUιʔείʔυ্ͰJNQPSU0CTFSWBUJPOͰએݴ͢Δ͜ͱͰ࢖༻Մೳ

Slide 9

Slide 9 text

%JTDPWFS 0CTFSWBUJPOJO 4XJGU6* IUUQTEFWFMPQFSBQQMFDPN XXED

Slide 10

Slide 10 text

೔ຊޠʹ༁ͨ͠༗ࢤͷํ ʲ88%$ʳ%JTDPWFS0CTFSWBUJPOJO 4XJGU6*ʢ೔ຊޠ༁ʣ IUUQTCMPHDPEFDBOEZDPN EJTDPWFS@PCTFSWBUJPO@JO@TXJGUVJ

Slide 11

Slide 11 text

େ·͔ͳ಺༰ %JTDPWFS0CTFSWBUJPOJO4XJGU6*

Slide 12

Slide 12 text

0CTFSWBUJPO GSBNFXPSLͰ͜Ε· Ͱͷํ๏ΑΓ΋࢖͍΍ ͘͢ͳͬͨͥɺώϟο ϋʔʂ ৽ػೳਪ͠ͰϝϦοτ͕͸͖ͬΓ͠ͳ͍ɻ

Slide 13

Slide 13 text

ଞͷهࣄ΋ݟͯΈΔ

Slide 14

Slide 14 text

88%$ޙͷ#MPHهࣄ ͞Α͏ͳΒɺ$PNCJOFɻͦͯ͜͠Μʹͪ͸ɺ0CTFSWBUJPOɻ2JJUB IUUQTRJJUBDPNMPWFFJUFNTECCBCCD େ·͔ͳ಺༰ ͜Ε·Ͱͷ࢓૊Έ $PNCJOFGSBNFXPSL ͸4XJGU6*͕ඞཁͱͯ͠ ͍Δঢ়ଶ؂ࢹʹ͸༨ܭͳ΋ͷ͕ଟ͗ͨ͢ɻ 4XJGU6*ʹඞཁͳঢ়ଶ؂ࢹ͚ͩΛఏڙͨ͠ͷ͕0CTFSWBUJPOͳͷͰ ࠓޙ͸0CTFSWBUJPOΛ࢖͍ͬͯ͜͏ɻ

Slide 15

Slide 15 text

🤔

Slide 16

Slide 16 text

ͳͥ0CTFSWBUJPO ໌֬ͳར఺΍ࠓޙͷల๬͕ظ଴Ͱ͖ͳ͍ݶΓɺ৽ϑϨʔϜϫʔΫΛ ಋೖ͢Δಈػͱͯ͠͸ෆ଍ͯ͠͸͍ͳ͍͔ ৽͍ٕ͠ज़ΛਐΊΔͳΒ͹ཧ٧Ίͷ෦෼͕΋͏ͪΐͬͱཉ͍͠

Slide 17

Slide 17 text

0CTFSWBUJPOʹؔ܎͢Δηογϣϯ 0CTFSWBUJPOͷઆ໌͸4XJGUͷ৽ػೳ 88%$ ͷதͰ4XJGUNBDSPT ͷઆ໌ʹؚ·Ε͍ͯΔ ˠ4XJGU6*͕0CTFSWBUJPOΛಋೖ͢Δར఺ʹ͍ͭͯ͸໌֬ʹ͸ޠΒΕ ͍ͯͳ͍ɻ IUUQTEFWFMPQFSBQQMFDPNXXED UJNF

Slide 18

Slide 18 text

$PNCJOFͱ0CTFSWBUJPO ৽چҧ͍Λߟ͑Δʹ͸Ͳ͏͢Ε͹ྑ͍͔

Slide 19

Slide 19 text

ͳΒ͹ಉ͡ػೳΛ αϯϓϧίʔυͰ֬ೝͯ͠ΈΑ͏

Slide 20

Slide 20 text

هड़ํ๏ൺֱ $PNCJOFͱ0CTFSWBUJPO

Slide 21

Slide 21 text

αϯϓϧίʔυ J04ʙ 0CTFSWBUJPO$PNCJOF$PEF$PNQBSJTPO HJUIVCDPNOPUPSPJE 0CTFSWBUJPO$PNCJOF$PEF$PNQBSJTPO

Slide 22

Slide 22 text

αϯϓϧίʔυΛݟΔલʹ 4XJGU6*ͷ͓໿ଋΛ֬ೝ HJUIVCDPNOPUPSPJE 0CTFSWBUJPO$PNCJOF$PEF$PNQBSJTPO

Slide 23

Slide 23 text

%BUB'MPX 5ISPVHI4XJGU6* 88%$ EFWFMPQFSBQQMFDPN WJEFPTQMBZ XXED UJNF

Slide 24

Slide 24 text

%BUB'MPX 5ISPVHI4XJGU6* 88%$ EFWFMPQFSBQQMFDPN WJEFPTQMBZ XXED UJNF

Slide 25

Slide 25 text

4XJGU6*Ͱͷσʔλهड़Օॴίϯηϓτ

Slide 26

Slide 26 text

ᶃσʔλιʔεΛ഑ஔ͢Δ7JFX ᶄσʔλιʔε 4XJGU6*Ͱͷσʔλهड़Օॴίϯηϓτ ᶅσʔλιʔεΛ؍ଌ͢Δ7JFX

Slide 27

Slide 27 text

ᶃσʔλιʔεΛ഑ஔ͢Δ7JFX ᶄσʔλιʔε͸ ΦϒδΣΫτதͷଐੑΛ؍ଌͤ͞ Δɻ 4XJGU6*Ͱͷσʔλهड़Օॴ ᶅσʔλιʔεΛ؍ଌ͢Δ7JFX

Slide 28

Slide 28 text

ᶃσʔλιʔεΛ഑ஔ͢Δ"QQ 4XJGU6*୯ମͰΞϓϦΛ࡞੒Ͱ ͖ΔΑ͏ʹͳͬͨͨΊ ᶄσʔλιʔε͸ ΦϒδΣΫτதͷଐੑΛ؍ଌͤ͞ Δɻ 4XJGU6*Ͱͷσʔλهड़Օॴ ᶅσʔλιʔεΛ؍ଌ͢Δ7JFX

Slide 29

Slide 29 text

4XJGU6*Ͱ͸؍ଌ͢Δ؍ଌՄೳͳ σʔλΦϒδΣΫτͷ ࢀরํ๏͕େ·͔ʹͭ

Slide 30

Slide 30 text

؍ଌՄೳͳσʔλͷࢀরํ๏ ύϥϝʔλʔ౉͠ ؀ڥม਺౉͠ 7JFXͷม਺ͱͯ͠࢖͏

Slide 31

Slide 31 text

؍ଌՄೳͳσʔλͷࢀরํ๏ύϥϝʔλʔ౉͠

Slide 32

Slide 32 text

؍ଌՄೳͳσʔλͷࢀরํ๏؀ڥม਺౉͠

Slide 33

Slide 33 text

؍ଌՄೳͳσʔλͷࢀরํ๏7JFXͷม਺ͱͯ͠࢖͏

Slide 34

Slide 34 text

λάฤूΞϓϦ w 5BHͷू߹Λ؅ཧ͢ΔΞϓϦ w 5BHʹ͸࿈൪Λ͚ͭΔ w 0CTFSWBUJPO$PNCJOFͷಉ͡ί ʔυΛهड़ w ؍ଌ͢ΔΦϒδΣΫτͷ౉͠ํ ΋छ༻ҙ αϯϓϧίʔυ

Slide 35

Slide 35 text

B λά5BH import Foundation struct Tag: Identifiable { let name: String let value: Int var id: Int { value } } extension Array { static func defaultTags() -> [Tag] { [.init(name: "Tag1", value: 1), .init(name: "Tag2", value: 2), .init(name: "Tag3", value: 3)] } } ᶃ*EFOUJ fi BCMFϓϩτίϧΛࢦఆ ᶄ഑ྻॳظԽ༻ͷTUBUJDؔ਺

Slide 36

Slide 36 text

C 7JFXͷॲཧ struct ContentViewByObservationDependOnViewLifecycle: View { var tagCollection: TagCollectionByObservation = .init() var body: some View { VStack { Button { let newTagValue = tagCollection.collectionCount + 1 tagCollection.collection.append( .init(name: "Tag\(newTagValue)", value: newTagValue) ) } label: { Text("Add") } Text("Tag number:\(tagCollection.collectionCount)") List(tagCollection.collection) { tag in Label( title: { Text("\(tag.name)") }, icon: { Image(systemName: "tag.fill") } ) } .listStyle(.plain) } .padding() } } ᶃ7JFXͰ͸એݴʹҧ͍͋Γ ᶄϘλϯΛλοϓ͢Δͱ 5BH͕૿͑Δ͚ͩ

Slide 37

Slide 37 text

D σʔλιʔεΛ഑ஔ͢Δ"QQ import SwiftUI @main struct ObservationCombineCodeComparisonApp: App { @StateObject var tagCollectionByCombine: TagCollectionByCombine = .init() var tagCollectionByObservation:TagCollectionByObservation = .init() var body: some Scene { … } } @StateObject var tagCollectionByCombine: TagCollectionByCombine = .init() var tagCollectionByObservation:TagCollectionByObservation = .init() $PNCJOF 0CTFSWBUJPO ᶃঢ়ଶର৅ʹࢦఆ͢Δ4XJGU"UUSJCVUFT ᶄಛʹهड़ͳ͠

Slide 38

Slide 38 text

E σʔλιʔεΦϒδΣΫτ $PNCJOF 0CTFSWBUJPO import Foundation class TagCollectionByCombine: ObservableObject { @Published var collection: [Tag] = .defaultTags() var collectionCount: Int { collection.count } } import Observation @Observable class TagCollectionByObservation { var collection: [Tag] = .defaultTags() var collectionCount: Int { collection.count } } ᶄ!0CTFSWBCMFΛΫϥεͷલʹ෇͚Δ ᶃ0CTFSWBCMF0CKFDUͷ೿ੜΫϥε

Slide 39

Slide 39 text

F ؍ଌՄೳͳσʔλͷ౉͠ํ $PNCJOF 0CTFSWBUJPO ContentViewByCombineFromParameter(tagCollection: tagCollectionByCombine) ContentViewByCombineFromEmvironment() .environmentObject(tagCollectionByCombine) ContentViewByObservationFromParameter(tagCollection: tagCollectionByObservation) ContentViewByObservationFromEmvironment() .environment(tagCollectionByObservation) FOWJSPONFOU0CKFDUͱFOWJSPONFOUͷҧ͍

Slide 40

Slide 40 text

G σʔλιʔεΛ؍ଌ͢Δଆͷఆٛ $PNCJOF 0CTFSWBUJPO struct ContentViewByCombineFromParameter: View { @ObservedObject var tagCollection: TagCollectionByCombine } struct ContentViewByCombineFromEmvironment: View { @EnvironmentObject var tagCollection: TagCollectionByCombine } struct ContentViewByObservationFromParameter: View { var tagCollection: TagCollectionByObservation } struct ContentViewByObservationFromEmvironment: View { @Environment(TagCollectionByObservation.self) var tagCollection: } ᶃҾ਺Ͱ౉͞ΕΔ৔߹ ᶄ؀ڥม਺Ͱ౉͞ΕΔ৔߹ ᶅ؀ڥม਺Ͱ౉͞ΕΔ৔߹ͷΈࢦఆ

Slide 41

Slide 41 text

struct ContentViewDependOnViewLifecycle: View { @StateObject var tagCollection: TagCollectionByCombine = .init() } H 7JFXͷม਺ͱͯ͠ಠཱͯ͠࢖͏ $PNCJOF 0CTFSWBUJPO ᶃม਺ఆٛͰ͸!4UBUF0CKFDU͕ඞཁ struct ContentViewByObservationDependOnViewLifecycle: View { var tagCollection: TagCollectionByObservation = .init() } ᶄಛʹࢦఆͳ͠

Slide 42

Slide 42 text

$PNCJOFͱ0CTFSWBUJPOͷҧ͍ هड़͢ΔՕॴ͸ͦΕ΄ͲมΘΒͣ $PNCJOF 0CTFSWBUJPO ϑϨʔϜϫʔΫ 'PVOEBUJPO $PNCJOF͸ඪ४ѻ͍ 0CTFSWBUJPO σʔλιʔεͷఆٛ !4UBUF0CKFDU ಛʹͳ͠ σʔλιʔεͷએݴ 0CTFSWBCMF0CKFDUͷ೿ੜΫϥε ؍ଌ͍ͤͨ͞ଐੑʹ!1VCMJTIFEࢦఆ Ϋϥεͷઌ಄ʹ!0CTFSWBCMF Կ΋ࢦఆ͠ͳ͍ͱ؍ଌ͢Δଐੑʹ σʔλιʔεΛ؍ଌ͢Δ ଆͷఆٛ !0CTFSWFE0CKFDU !&OWJSPONFOU0CKFDU ؀ڥม਺Ͱ౉͞ΕΔ৔߹ͷΈ !&OWJSPONFOU σʔλόΠϯσΟϯά ৗʹ༗ޮ !#JOEBCMFΛࢦఆ͠ͳ͍ͱ༗ޮ ʹͳΒͳ͍

Slide 43

Slide 43 text

هड़ํ๏͕एׯมΘ͍ͬͯΔ͕ ϝϦοτ͸͋Δͷ͔

Slide 44

Slide 44 text

0CTFSWBUJPOͷૂ͍

Slide 45

Slide 45 text

$PNCJOF ʙ Ͱ͸γϯϓϧʹ࣮ݱͰ͖ͳ͍͜ͱ͕ଟ͍ w σʔλ؍ଌͷͨΊʹ4XJGU"UUSJCVUFTΛ෇Ճ͢Δඞཁ͕͋Δ w !4UBUF0CKFDUɺ!0CTFSWFE0CKFDUɺ!&OWJSPONFOU0CKFDU w ഑ྻ ू߹Λ͞Βʹू߹ Λͦͷ··σʔλ؍ଌର৅ʹͰ͖ͳ͍ w 4XJGU6*Ͱ஋ΛऔΓѻ͏4XJGU"UUSJCVUFTͱিಥ͍ͯ͠Δ w !4UBUF w !"QQ4UPSBHF w !4DFOF4UPSFBHF

Slide 46

Slide 46 text

഑ྻ ू߹Λ͞Βʹू߹ Λͦͷ··σʔλ؍ଌର৅ʹ $PNCJOF 0CTFSWBUJPO @main struct ObservationCombineCodeComparisonApp: App { @StateObject var tagCollectionByCombine: [TagCollectionByCombine] = .init() } ΤϥʔͱͳΔ @main struct ObservationCombineCodeComparisonApp: App { var tagCollectionByObservation:[TagCollectionByObservation] = .init() } Τϥʔʹ͸ͳΒͣͦΕͧΕ؍ ଌՄೳͳσʔλΦϒδΣΫτ ͱͯ͠ػೳ

Slide 47

Slide 47 text

4XJGU6*Ͱ஋ΛऔΓѻ͏4XJGU"UUSJCVUFTͱিಥ͍ͯ͠Δ w !4UBUF w !"QQ4UPSBHF w !4DFOF4UPSFBHF ᶃ7JFX಺Ͱঢ়ଶ؂ࢹͰ͖Δม਺ʹࢦఆ ᶄΞϓϦͷετϨʔδ͔Βσʔλऔಘ ᶅγʔϯͷण໋಺Ͱ༗ޮͳσʔλ͔Βࢀর σʔλ؍ଌͷͨΊ͚ͩʹ4XJGU"UUSJCVUFTΛ઎༗͞ΕΔͱଞͷ༻్ͷ 4XJGU"UUSJCVUFTͷ࢖༻Λ๦͓͛ͯΓճආࡦͷͨΊͷίʔυهड़͕ඞཁ import Foundation class TagCollectionByCombine: ObservableObject { @Published var collection: [Tag] = .defaultTags() var collectionCount: Int { collection.count } }

Slide 48

Slide 48 text

4XJGU"UUSJCVUFTͱ͸Կ IUUQTTQFBLFSEFDLDPNOPUPSPJEBQQMFHBZBSJUBJGBOHUJTXJGUBUUSJCVUFT

Slide 49

Slide 49 text

0CTFSWBUJPOొ৔ͷഎܠ w 4XJGU6*ެ։࣌ ʙ w $PNCJOF w 4XJGU"UUSJCVUFT w Ϋϥε೿ੜ w 4XJGU.BDSPT ొ৔ w 0CTFSWBUJPOʹΑΔσʔλ؍ଌͷ࢓૊ΈΛ࣮ݱ w ա౓ʹ4XJGU"UUSJCVUFTґଘ͠ͳ͘ͳͬͨ

Slide 50

Slide 50 text

0CTFSWBUJPOͷͦͷଞͷಛ௃ w σʔλόΠϯσΟϯά͸Φϓγϣϯࢦఆ΁ w $PNCJOFͰ͸σʔλΦϒδΣΫτ͸σϑΥϧτͰ༗ޮ w !#JOEJOHΛ࢖͏ͱΦϒδΣΫτʹؚ·ΕΔσʔλΛࢀরɺมߋՄೳʹ w 0CTFSWBUJPOͰ͸σʔλΦϒδΣΫτͷࢀরଆͰ!#JOEBCMFࢦఆ͕ඞཁ w σʔλΦϒδΣΫτͷଐੑ͸σϑΥϧτͰ؍ଌର৅ʹ w !0CTFSWBUJPO*HOPSFEΛࢦఆ͠ͳ͍ݶΓৗʹ؍ଌର৅ѻ͍

Slide 51

Slide 51 text

·ͱΊ wσʔλ؍ଌͷ࢓૊Έͱͯ͠0CTFSWBUJPO͕ొ৔͠·ͨ͠ w4XJGU6*޲͚ w$PNCJOFͱࣅ௨ͬͨهड़͕Ͱ͖Δ͕ผ෺ w೥4XJGU6*ൃද౰ॳ͔Βͷෆຬ఺ ໃ६఺ Λվળ

Slide 52

Slide 52 text

ࢀߟ w %JTDPWFS0CTFSWBUJPOJO4XJGU6*88%$ 7JEFPT"QQMF%FWFMPQFS w IUUQTEFWFMPQFSBQQMFDPNXXED w ʲ88%$ʳ%JTDPWFS0CTFSWBUJPOJO4XJGU6*ʢ೔ຊ ޠ༁ʣJ1IPOFΞϓϦ։ൃߨ࠲ʛ$PEF$BOEZΦϯϥΠ ϯϓϩάϥϛϯάεΫʔϧ w IUUQTCMPHDPEFDBOEZDPN EJTDPWFS@PCTFSWBUJPO@JO@TXJGUVJ w ͞Α͏ͳΒɺ$PNCJOFɻͦͯ͜͠Μʹͪ͸ɺ 0CTFSWBUJPOɻ2JJUB w IUUQTRJJUBDPNMPWFFJUFNT ECCBCCD w 8IBU`TOFXJO4XJGU88%$7JEFPT"QQMF %FWFMPQFS w IUUQTEFWFMPQFSBQQMFDPNXXED UJNF w %BUB'MPX5ISPVHI4XJGU6*88%$7JEFPT "QQMF%FWFMPQFS w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZ XXED UJNF w "QQMF͕ ΍Γ͍ͨ์୊4XJGU"UUSJCVUFT4QFBLFS %FDL w IUUQTTQFBLFSEFDLDPNOPUPSPJEBQQMFHB ZBSJUBJGBOHUJTXJGUBUUSJCVUFT w Αͤ͋ͭΊ4XJGU4XJGU4QFBLFS%FDL w IUUQTTQFBLFSEFDLDPNOPUPSPJE ZPTFBUVNFTXJGUTXJGUEPU