Slide 1

Slide 1 text

TCAͰViewStoreͷStateʹ KeyPath DynamicMemberLookup͕ɹ ࢖ΘΕͯΔ݅ @yimajo 2020/11/22 #fa_ios iOSΞϓϦ։ൃͷͨΊͷFunctional Architecture৘ใڞ༗ձ2

Slide 2

Slide 2 text

TCA͸KeyPathʹΑΔ DynamicMemberLookup࢖ͬͯΜͷ͓΋͢ Εʔʂ ͜Ε͸͍͍ײ͡ͷ࢖͍ํ΍ʔ

Slide 3

Slide 3 text

ຊ౰ʹͦ͏͔ʁ ඞવੑͷ͋Δ࢖͍ํ͔ʁ

Slide 4

Slide 4 text

͍΍͍΍͍΍ɺ͍͍Ͱ͠ΐɻ Swift 4͘Β͍͔Βͷ KeyPath ɺ ͦͯ͠ Swift 4.2 ͔Βͷ Dynamic Member Lookupɺ ͜ΕΛ্ख͍͜ͱ૊Έ߹Θͤͨ Swift 5.1 ͔Βͷ Key Path ʹΑΔ Dynamic Member Lookup ΍Μɺ ͜ΕΛ࢖ͬͯΔͱؒ઀తʹͰ΋StateʹܕͰΞΫηε Ͱ͖ͯؾ࣋ͪ͑ʔΜ΍ɺͦΕҎ্ͷԿ͕͋Μͷ΍ʔʁ

Slide 5

Slide 5 text

͜Ε͸ͩΊͩɺௐ΂ͯ ߟ͑௚ͯ͠ΈΑ͏͔…

Slide 6

Slide 6 text

ࠓճͷ࿩ͷ֓ཁ

Slide 7

Slide 7 text

ࠓճͷ࿩ͷ֓ཁ • TCAͰ͸KeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ ͕࢖ΘΕ͍ͯΔ

Slide 8

Slide 8 text

ࠓճͷ࿩ͷ֓ཁ • TCAͰ͸KeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ ͕࢖ΘΕ͍ͯΔ • SwiftUI.View ͔Β State ͷ஋ΛݟΔͱ͖ͳͲ

Slide 9

Slide 9 text

ࠓճͷ࿩ͷ֓ཁ • TCAͰ͸KeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ ͕࢖ΘΕ͍ͯΔ • SwiftUI.View ͔Β State ͷ஋ΛݟΔͱ͖ͳͲ • ҙຯ͋Δͷʁ௕ॴ͸͋Δͷʁඞવੑ͸ʁ

Slide 10

Slide 10 text

ࠓճͷ࿩ͷ֓ཁ • TCAͰ͸KeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ ͕࢖ΘΕ͍ͯΔ • SwiftUI.View ͔Β State ͷ஋ΛݟΔͱ͖ͳͲ • ҙຯ͋Δͷʁ௕ॴ͸͋Δͷʁඞવੑ͸ʁ • ͜Ε͸ SwiftUI.View ͚ͩݟͯΔͱҙຯ΍ඞવੑ͸෼͔ΓͮΒ͍͔΋

Slide 11

Slide 11 text

ࠓճͷ࿩ͷ֓ཁ • TCAͰ͸KeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ ͕࢖ΘΕ͍ͯΔ • SwiftUI.View ͔Β State ͷ஋ΛݟΔͱ͖ͳͲ • ҙຯ͋Δͷʁ௕ॴ͸͋Δͷʁඞવੑ͸ʁ • ͜Ε͸ SwiftUI.View ͚ͩݟͯΔͱҙຯ΍ඞવੑ͸෼͔ΓͮΒ͍͔΋ • TCAͰͳ͍ઃܭ΋ҰԠৼΓฦΔ

Slide 12

Slide 12 text

ࠓճͷ࿩ͷ֓ཁ • TCAͰ͸KeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ ͕࢖ΘΕ͍ͯΔ • SwiftUI.View ͔Β State ͷ஋ΛݟΔͱ͖ͳͲ • ҙຯ͋Δͷʁ௕ॴ͸͋Δͷʁඞવੑ͸ʁ • ͜Ε͸ SwiftUI.View ͚ͩݟͯΔͱҙຯ΍ඞવੑ͸෼͔ΓͮΒ͍͔΋ • TCAͰͳ͍ઃܭ΋ҰԠৼΓฦΔ • UIKit ͔Β࢖͏৔߹Λ஌ͬͯΔͱඞવੑ͕͋ΔΑ͏ʹࢥ͑Δ

Slide 13

Slide 13 text

۩ମྫ

Slide 14

Slide 14 text

TCA ͷ SwiftUI Χ΢ϯλʔαϯϓϧ

Slide 15

Slide 15 text

TCA ͷ SwiftUI Χ΢ϯλʔαϯϓϧ

Slide 16

Slide 16 text

TCA ͷ SwiftUI Χ΢ϯλʔαϯϓϧ • SwiftUI͕storeΛอ࣋

Slide 17

Slide 17 text

TCA ͷ SwiftUI Χ΢ϯλʔαϯϓϧ • SwiftUI͕storeΛอ࣋ • store͔ΒviewStoreม਺औΓग़͠

Slide 18

Slide 18 text

TCA ͷ SwiftUI Χ΢ϯλʔαϯϓϧ • SwiftUI͕storeΛอ࣋ • store͔ΒviewStoreม਺औΓग़͠ • viewStoreܦ༝ͰcountʹΞΫηε

Slide 19

Slide 19 text

4XJGU6*7JFX 4UPSF4UBUF "DUJPO 4UBUF ViewStore

Slide 20

Slide 20 text

bow-swift/bow-arch ൺֱͱͯ͠

Slide 21

Slide 21 text

bow-swift/bow-arch ൺֱͱͯ͠

Slide 22

Slide 22 text

bow-swift/bow-arch • SwiftUI.View͕stateͱhandleΛอ࣋ ൺֱͱͯ͠

Slide 23

Slide 23 text

bow-swift/bow-arch • SwiftUI.View͕stateͱhandleΛอ࣋ • handle͕Stateͷૢ࡞ ൺֱͱͯ͠

Slide 24

Slide 24 text

bow-swift/bow-arch • SwiftUI.View͕stateͱhandleΛอ࣋ • handle͕Stateͷૢ࡞ • ͍ΘΏΔReducer ൺֱͱͯ͠

Slide 25

Slide 25 text

4XJGU6*7JFX 4UBUF )BOEMF

Slide 26

Slide 26 text

࣮ࡍ TCA Ͱ KeyPath Member Lookup ͨ͘͠ͳΔؾ࣋ͪ΋෼͔Δ͕ ͳͯ͘΋ྑ͍ؾ΋͢Δ

Slide 27

Slide 27 text

UIKitͰͷTCAͷ࢖͍ํΛݟͯΈΔ

Slide 28

Slide 28 text

TCAͰUIKitͰͷ Χ΢ϯλʔαϯϓϧ … লུ

Slide 29

Slide 29 text

TCAͰUIKitͰͷ Χ΢ϯλʔαϯϓϧ … লུ

Slide 30

Slide 30 text

TCAͰUIKitͰͷ Χ΢ϯλʔαϯϓϧ • viewStore.publisher Ͱ $0.count … লུ

Slide 31

Slide 31 text

TCAͰUIKitͰͷ Χ΢ϯλʔαϯϓϧ • viewStore.publisher Ͱ $0.count • ͦͷ஋ΛUITextLabelͷtextʹ … লུ

Slide 32

Slide 32 text

TCAͰUIKitͰͷ Χ΢ϯλʔαϯϓϧ • viewStore.publisher Ͱ $0.count • ͦͷ஋ΛUITextLabelͷtextʹ … লུ ͭ·Γ State ͕ Publisher ͰऔಘͰ͖Δ

Slide 33

Slide 33 text

ViewStoreΈͯΈΔ

Slide 34

Slide 34 text

ViewStoreΈͯΈΔ • publisher: StorePublisher

Slide 35

Slide 35 text

ViewStoreΈͯΈΔ • publisher: StorePublisher StorePublisher Λ ͞Βʹৄ͘͠஌Γ͍ͨ

Slide 36

Slide 36 text

StorePublisherΈͯΈΔ

Slide 37

Slide 37 text

StorePublisherΈͯΈΔ • StorePublisher͸Publisherʹ४ڌͯ͠ ͍ΔͷͰStateΛετϦʔϜʹྲྀͤΔ

Slide 38

Slide 38 text

StorePublisherΈͯΈΔ • StorePublisher͸Publisherʹ४ڌͯ͠ ͍ΔͷͰStateΛετϦʔϜʹྲྀͤΔ

Slide 39

Slide 39 text

StorePublisherΈͯΈΔ • StorePublisher͸Publisherʹ४ڌͯ͠ ͍ΔͷͰStateΛετϦʔϜʹྲྀͤΔ • ͞Βʹ subscript Ͱmapͯ͠Δ

Slide 40

Slide 40 text

StorePublisherΈͯΈΔ • StorePublisher͸Publisherʹ४ڌͯ͠ ͍ΔͷͰStateΛετϦʔϜʹྲྀͤΔ • ͞Βʹ subscript Ͱmapͯ͠Δ ͭ·ΓɺStorePublisherʹରͯ͠΋ KeyPath Member Lookup ͯ͠ map ͠ Publisher Λฦͯ͠Δ

Slide 41

Slide 41 text

→ self.viewStore.publisher.count .assign(to: \.text, on: countLabel) .store(in: &self.cancellables) ͭ·Γ …

Slide 42

Slide 42 text

→ self.viewStore.publisher.count .assign(to: \.text, on: countLabel) .store(in: &self.cancellables) ࠨͷΑ͏ʹࣗલͰ .publisher ʹ .map Λॻ͔ͳ͍͍ͯ͘ʂ ͭ·Γ …

Slide 43

Slide 43 text

→ self.viewStore.publisher.count .assign(to: \.text, on: countLabel) .store(in: &self.cancellables) ࠨͷΑ͏ʹࣗલͰ .publisher ʹ .map Λॻ͔ͳ͍͍ͯ͘ʂ KeyPath Member Lookup ࢖ͬͯলུͰ͖Δʢӈʣɻ ͭ·Γ …

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

\\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏ม਺͸ݟ͑ͳͯ͘ྑͦ͞͏ ///

Slide 46

Slide 46 text

↓ \\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏ม਺͸ݟ͑ͳͯ͘ྑͦ͞͏ ///

Slide 47

Slide 47 text

↓ ετϦʔϜΛѻΘͣ State ͷϓϩύςΟ͕ཉ͍͠ͱ͖΋ɺ \\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏ม਺͸ݟ͑ͳͯ͘ྑͦ͞͏ ///

Slide 48

Slide 48 text

↓ ετϦʔϜΛѻΘͣ State ͷϓϩύςΟ͕ཉ͍͠ͱ͖΋ɺ State ͱ͍͏ม਺͸ݟ͑ͳ͍΄͏͕ରশੑ͕͋Δ…͔΋… \\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏ม਺͸ݟ͑ͳͯ͘ྑͦ͞͏ ///

Slide 49

Slide 49 text

7JFX4UPSF 4UBUF viewStore.count ͍ͩ͘͞ state.count: Int ฦ͢ viewStore.publisher.count ͍ͩ͘͞ StorePublisher͔Β StorePublisherͳ count ฦ͢ ϓϩύςΟͷ ஋͕ཉ͍͠ 1VCMJTIFSΛ TJOLͯ͠ Ͳ͏ʹ͔͍ͨ͠

Slide 50

Slide 50 text

͓ΘΓʹ: ٞ࿦ͷϙΠϯτ • KeyPath Member Lookup ͳͯ͘΋ྑ͍ͱ͸ࢥ͏͚Ͳ΋ • Publisherͱͯ͠ཉ͍͠৔߹ͷΠϯλϑΣʔεͰ͸৑௕͞Λল͚ͯΔ • StateͷϓϩύςΟ͕΄͍͠ͱ͖΋ɺKeyPath Member LookupΛ ࢖ͬͨ΄͏͕ରশੑ΍౷Ұײ͕͋Δͷ͸෼͔Δ