iOSアプリ開発のためのFunctional Architecture情報共有会2 の発表資料です。 https://connpass.com/event/194239/
TCAͰViewStoreͷStateʹKeyPath DynamicMemberLookup͕ɹΘΕͯΔ݅@yimajo 2020/11/22 #fa_iosiOSΞϓϦ։ൃͷͨΊͷFunctional Architectureใڞ༗ձ2
View Slide
TCAKeyPathʹΑΔDynamicMemberLookupͬͯΜͷ͓͢Εʔʂ͜Ε͍͍ײ͡ͷ͍ํʔ
ຊʹͦ͏͔ʁඞવੑͷ͋Δ͍ํ͔ʁ
͍͍͍ɺ͍͍Ͱ͠ΐɻSwift 4͘Β͍͔Βͷ KeyPath ɺͦͯ͠ Swift 4.2 ͔Βͷ Dynamic Member Lookupɺ͜ΕΛ্ख͍͜ͱΈ߹Θͤͨ Swift 5.1 ͔ΒͷKey Path ʹΑΔ Dynamic Member Lookup Μɺ͜ΕΛͬͯΔͱؒతʹͰStateʹܕͰΞΫηεͰ͖ͯؾ࣋ͪ͑ʔΜɺͦΕҎ্ͷԿ͕͋Μͷʔʁ
͜ΕͩΊͩɺௐͯߟ͑ͯ͠ΈΑ͏͔…
ࠓճͷͷ֓ཁ
ࠓճͷͷ֓ཁ• TCAͰKeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ͕ΘΕ͍ͯΔ
ࠓճͷͷ֓ཁ• TCAͰKeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ͕ΘΕ͍ͯΔ• SwiftUI.View ͔Β State ͷΛݟΔͱ͖ͳͲ
ࠓճͷͷ֓ཁ• TCAͰKeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ͕ΘΕ͍ͯΔ• SwiftUI.View ͔Β State ͷΛݟΔͱ͖ͳͲ• ҙຯ͋Δͷʁॴ͋Δͷʁඞવੑʁ
ࠓճͷͷ֓ཁ• TCAͰKeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ͕ΘΕ͍ͯΔ• SwiftUI.View ͔Β State ͷΛݟΔͱ͖ͳͲ• ҙຯ͋Δͷʁॴ͋Δͷʁඞવੑʁ• ͜Ε SwiftUI.View ͚ͩݟͯΔͱҙຯඞવੑ͔ΓͮΒ͍͔
ࠓճͷͷ֓ཁ• TCAͰKeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ͕ΘΕ͍ͯΔ• SwiftUI.View ͔Β State ͷΛݟΔͱ͖ͳͲ• ҙຯ͋Δͷʁॴ͋Δͷʁඞવੑʁ• ͜Ε SwiftUI.View ͚ͩݟͯΔͱҙຯඞવੑ͔ΓͮΒ͍͔• TCAͰͳ͍ઃܭҰԠৼΓฦΔ
ࠓճͷͷ֓ཁ• TCAͰKeyPathʹΑΔDynamic Member LookupʢҎ߱ KeyPath Member Lookupʣ͕ΘΕ͍ͯΔ• SwiftUI.View ͔Β State ͷΛݟΔͱ͖ͳͲ• ҙຯ͋Δͷʁॴ͋Δͷʁඞવੑʁ• ͜Ε SwiftUI.View ͚ͩݟͯΔͱҙຯඞવੑ͔ΓͮΒ͍͔• TCAͰͳ͍ઃܭҰԠৼΓฦΔ• UIKit ͔Β͏߹ΛͬͯΔͱඞવੑ͕͋ΔΑ͏ʹࢥ͑Δ
۩ମྫ
TCA ͷ SwiftUI Χϯλʔαϯϓϧ
TCA ͷ SwiftUI Χϯλʔαϯϓϧ• SwiftUI͕storeΛอ࣋
TCA ͷ SwiftUI Χϯλʔαϯϓϧ• SwiftUI͕storeΛอ࣋• store͔ΒviewStoreมऔΓग़͠
TCA ͷ SwiftUI Χϯλʔαϯϓϧ• SwiftUI͕storeΛอ࣋• store͔ΒviewStoreมऔΓग़͠• viewStoreܦ༝ͰcountʹΞΫηε
4XJGU6*7JFX4UPSF4UBUF "DUJPO4UBUFViewStore
bow-swift/bow-archൺֱͱͯ͠
bow-swift/bow-arch• SwiftUI.View͕stateͱhandleΛอ࣋ൺֱͱͯ͠
bow-swift/bow-arch• SwiftUI.View͕stateͱhandleΛอ࣋• handle͕Stateͷૢ࡞ൺֱͱͯ͠
bow-swift/bow-arch• SwiftUI.View͕stateͱhandleΛอ࣋• handle͕Stateͷૢ࡞• ͍ΘΏΔReducerൺֱͱͯ͠
4XJGU6*7JFX4UBUF )BOEMF
࣮ࡍTCA Ͱ KeyPath Member Lookupͨ͘͠ͳΔؾ͔࣋ͪΔ͕ͳͯ͘ྑ͍ؾ͢Δ
UIKitͰͷTCAͷ͍ํΛݟͯΈΔ
TCAͰUIKitͰͷΧϯλʔαϯϓϧ… লུ
TCAͰUIKitͰͷΧϯλʔαϯϓϧ• viewStore.publisher Ͱ $0.count… লུ
TCAͰUIKitͰͷΧϯλʔαϯϓϧ• viewStore.publisher Ͱ $0.count• ͦͷΛUITextLabelͷtextʹ… লུ
TCAͰUIKitͰͷΧϯλʔαϯϓϧ• viewStore.publisher Ͱ $0.count• ͦͷΛUITextLabelͷtextʹ… লུͭ·ΓState ͕ Publisher ͰऔಘͰ͖Δ
ViewStoreΈͯΈΔ
ViewStoreΈͯΈΔ• publisher:StorePublisher
ViewStoreΈͯΈΔ• publisher:StorePublisherStorePublisher Λ͞Βʹৄ͘͠Γ͍ͨ
StorePublisherΈͯΈΔ
StorePublisherΈͯΈΔ• StorePublisherPublisherʹ४ڌ͍ͯ͠ΔͷͰStateΛετϦʔϜʹྲྀͤΔ
StorePublisherΈͯΈΔ• StorePublisherPublisherʹ४ڌ͍ͯ͠ΔͷͰStateΛετϦʔϜʹྲྀͤΔ• ͞Βʹ subscript Ͱmapͯ͠Δ
StorePublisherΈͯΈΔ• StorePublisherPublisherʹ४ڌ͍ͯ͠ΔͷͰStateΛετϦʔϜʹྲྀͤΔ• ͞Βʹ subscript Ͱmapͯ͠Δͭ·ΓɺStorePublisherʹରͯ͠KeyPath Member Lookup ͯ͠ map͠ Publisher Λฦͯ͠Δ
→self.viewStore.publisher.count.assign(to: \.text, on: countLabel).store(in: &self.cancellables)ͭ·Γ …
→self.viewStore.publisher.count.assign(to: \.text, on: countLabel).store(in: &self.cancellables)ࠨͷΑ͏ʹࣗલͰ .publisher ʹ .map Λॻ͔ͳ͍͍ͯ͘ʂͭ·Γ …
→self.viewStore.publisher.count.assign(to: \.text, on: countLabel).store(in: &self.cancellables)ࠨͷΑ͏ʹࣗલͰ .publisher ʹ .map Λॻ͔ͳ͍͍ͯ͘ʂKeyPath Member Lookup ͬͯলུͰ͖Δʢӈʣɻͭ·Γ …
\\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏มݟ͑ͳͯ͘ྑͦ͞͏ ///
↓\\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏มݟ͑ͳͯ͘ྑͦ͞͏ ///
↓ετϦʔϜΛѻΘͣ State ͷϓϩύςΟ͕ཉ͍͠ͱ͖ɺ\\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏มݟ͑ͳͯ͘ྑͦ͞͏ ///
↓ετϦʔϜΛѻΘͣ State ͷϓϩύςΟ͕ཉ͍͠ͱ͖ɺState ͱ͍͏มݟ͑ͳ͍΄͏͕ରশੑ͕͋Δ…͔…\\\ ετϦʔϜΛѻ͏ͱ͖ State ͱ͍͏มݟ͑ͳͯ͘ྑͦ͞͏ ///
7JFX4UPSF4UBUFviewStore.count ͍ͩ͘͞state.count: Int ฦ͢viewStore.publisher.count ͍ͩ͘͞StorePublisher͔ΒStorePublisherͳ count ฦ͢ϓϩύςΟͷ͕ཉ͍͠1VCMJTIFSΛTJOLͯ͠Ͳ͏ʹ͔͍ͨ͠
͓ΘΓʹ: ٞͷϙΠϯτ• KeyPath Member Lookup ͳͯ͘ྑ͍ͱࢥ͏͚Ͳ• Publisherͱͯ͠ཉ͍͠߹ͷΠϯλϑΣʔεͰ͞Λল͚ͯΔ• StateͷϓϩύςΟ͕΄͍͠ͱ͖ɺKeyPath Member LookupΛͬͨ΄͏͕ରশੑ౷Ұײ͕͋Δͷ͔Δ