Upgrade to Pro — share decks privately, control downloads, hide ads and more …

既存アプリへのSwiftUI導入事例

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 既存アプリへのSwiftUI導入事例

Avatar for Takashico

Takashico

July 05, 2021
Tweet

More Decks by Takashico

Other Decks in Programming

Transcript

  1. 2 ࣗݾ঺հ • Shiko Takahashi • iOSΞϓϦΤϯδχΞ • Android΋͸͡Ί·ͨ͠ʂ •

    ٳΈͷ೔͸ɺೣͱ༡Ϳ ɻ @takashico @takashico smtakahashi
  2. 6 SwiftUIͱ͸ • ৽͍͠UIϑϨʔϜϫʔΫʢWWDC19ʣ ◦ গͳ͍ίʔυͰUIߏங͕Մೳ ◦ એݴܕγϯλοΫεʢγϯϓϧʣ ◦ ϓϨϏϡʔػೳʢσόοάޮ཰UPʣ

    ◦ etc… • αϙʔτΛiOS13.0Ҏ্ʹ͢Δඞཁ͕͋Δ SwiftUI ΑΓ༏ΕͨAppΛɺΑΓগͳ͍ίʔυͰɻ ࢀর: https://developer.apple.com/jp/xcode/swiftui
  3. 7 SwiftUIͱ͸ • ৽͍͠UIϑϨʔϜϫʔΫʢWWDC19ʣ ◦ গͳ͍ίʔυͰUIߏங͕Մೳ ◦ એݴܕγϯλοΫεʢγϯϓϧʣ ◦ ϓϨϏϡʔػೳʢσόοάޮ཰UPʣ

    ◦ etc… • αϙʔτΛiOS13.0Ҏ্ʹ͢Δඞཁ͕͋Δ SwiftUI ΑΓ༏ΕͨAppΛɺΑΓগͳ͍ίʔυͰɻ ࢀর: https://developer.apple.com/jp/xcode/swiftui ͜ͷ੍໿ʹΑͬͯಋೖ͕೉͔ͬͨ͠
  4. 8 SwiftUIͱ͸ • ৽͍͠UIϑϨʔϜϫʔΫʢWWDC19ʣ ◦ গͳ͍ίʔυͰUIߏங͕Մೳ ◦ એݴܕγϯλοΫεʢγϯϓϧʣ ◦ ϓϨϏϡʔػೳʢσόοάޮ཰UPʣ

    ◦ etc… • αϙʔτΛiOS13.0Ҏ্ʹ͢Δඞཁ͕͋Δ SwiftUI ΑΓ༏ΕͨAppΛɺΑΓগͳ͍ίʔυͰɻ ࢀর: https://developer.apple.com/jp/xcode/swiftui ͜ͷ੍໿ʹΑͬͯಋೖ͕೉͔ͬͨ͠ εϖʔεϚʔέοτΞϓϦʹ ͍͔ͭಋೖ͍ͨ͠ͳͱߟ͍͑ͯ·ͨ͠🤔 ʢಋೖલ·Ͱ͸iOS11.4·Ͱαϙʔτͯ͠ ͍·ͨ͠ʣ
  5. 30 σβΠϯ௨Γͷը໘Λ࡞੒Ͱ͖Δͷ͔ʁ • ListʢchildrenʣΛ࢖༻͢Δํ๏ • DisclosureGroupΛ࢖༻͢Δํ๏ ͜ΕΒͷ࣮૷ํ๏Ͱ࣮ݱͰ͖Δ͜ͱΛ֬ೝ // isExpanded: ల։ϑϥά

    DisclosureGroup( isExpanded: $isExpanded, content: { // ࢠΧςΰϦCell }, label: { // ਌ΧςΰϦCell } ) // categories: ΧςΰϦʔͷ഑ྻ List(categories, children: \.children) { item in // ࢠΧςΰϦCell }
  6. 31 σβΠϯ௨Γͷը໘Λ࡞੒Ͱ͖Δͷ͔ʁ • ListʢchildrenʣΛ࢖༻͢Δํ๏ • DissclosureGroupΛ࢖༻͢Δํ๏ ͜ΕΒͷ࣮૷ํ๏Ͱ࣮ݱͰ͖Δ͜ͱΛ֬ೝ // isExpanded: ల։ϑϥά

    DisclosureGroup( isExpanded: $isExpanded, content: { // ࢠΧςΰϦCell }, label: { // ਌ΧςΰϦCell } ) // categories: ΧςΰϦʔͷ഑ྻ List(categories, children: \.children) { item in // ࢠΧςΰϦCell } ଞͷը໘΋࣮ݱՄೳͰ͋Δ͜ͱΛ֬ೝ͠ ·ͨ͠ɻ ※ ຊ࣮૷ͯ͠Έͳ͍ͱΘ͔Βͳ͍఺΋ଟ͍ͷ Ͱɺ͋͘·Ͱ΋βοΫϦͱ֬ೝ͠·ͨ͠ɻ
  7. 34 UIKitͱซ༻࣮ͨ͠૷ • SwiftUIͰ࡞੒ͨ͠ը໘ΛViewͱͯ͠ѻ͏͜ ͱͰॊೈʹରԠ ◦ ΋͠໰୊͕ൃੜͨ͠৔߹ʹ͸ɺ෦෼త ʹ࢖༻͢Δ͜ͱͳͲॊೈʹରԠՄೳ • ίϯτϩʔϥʔ෦ͷෆ۩߹͸க໋తͳӨڹΛ

    ༩͑ΔڪΕ͕͋ΔͨΊɺViewControllerʹ੹ ຿Λ࣋ͨͤΔߏ଄Ͱ࣮૷ • UIHostingControllerΛ࢖ͬͯUIKitଆ͔Β SwiftUIͰ࡞੒ͨ͠ΦϒδΣΫτΛੜ੒Ͱ͖Δ
  8. 35 SwiftUIΛ૊ΈࠐΉίʔυ // HomeContainerView: SwiftUIͰ࡞੒ͨ͠ը໘ let homeContainerVC = UIHostingController(rootView: HomeContainerView())

    guard let homeContainerView = homeContainerVC.view else { return } self.addChild(homeContainerVC) homeContainerVC.didMove(toParent: self) self.view.addSubview(homeContainerView) // Auto Layout੍໿Λઃఆ homeContainerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ homeContainerView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0.0), homeContainerView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0.0), homeContainerView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0.0), homeContainerView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0.0) ])
  9. 38 Delegate /// DelegateΛఆٛ protocol BannerViewDelegate: AnyObject { func didSelectBanner(uid:

    String) } /// BannerViewDelegateͷॲཧ extension HomeViewController: BannerViewDelegate { func didSelectBanner(uid: String) { // ը໘ભҠͷॲཧ } } HomeViewController.swift struct BannerView: View { weak var delegate: BannerViewDelegate? var body: some View { // όφʔը૾ʹରͯ͠onTapGestureΛઃఆ Image(”όφʔը૾”) .onTapGesture { self.delegate?.didSelectBanner(uid: "όφʔUid") } } } BannerView.swift
  10. 39 DataSource /// ObservableObjectϓϩτϩϧΛܧঝͨ͠ΫϥεͰఆٛ͢Δ class DataSource: ObservableObject { @Published var

    banners: [Banner] = [] } // ஋Λߋ৽͢Δ BannerView.DataSorce.banners = ["όφʔ৘ใ"] σʔλΛऔಘ dataSourceʢObservedObjectʣ ͷ஋Λ؂ࢹ͍ͯ͠ΔͨΊɺ ஋ʢbannersʣ͕ߋ৽͞Εͨ৔߹͸ Viewͷ࠶ඳը͕ߦΘΕΔ ᶃ ᶄ ᶅ dataSourceʢObservedObjectʣ ʹऔಘͨ͠σʔλΛ౉͢
  11. 42 iOS13ಛ༗ͷ໰୊Λճආ • ಈ࡞͕ෆ҆ఆͱ͍͏ใࠂ͕͋Δ ◦ SwiftUI NavigationView broken in iOS

    13.3 ◦ ϚΠφʔόʔδϣϯʹΑͬͯڍಈ͕มΘΔ • iOS13Ͱ࢖༻Ͱ͖ΔAPI͕ݶΒΕ͍ͯΔ ◦ ࢖༻Ͱ͖ΔAPIͷΈͰ࣮૷͠Α͏ͱ͢ΔͱɺύϑΥʔϚϯεΛམͱ͢ڪΕ͕͋Δ 
 ʢLazyܥͳͲ͕࢖༻Ͱ͖ͳ͍ͨΊʣ ◦ ࣮૷ʹ޻෉͕ඞཁʢUIKitΛϥοϓͯ͠࢖༻͢ΔͳͲʣ ɹɹɹ˞ UIKitͱൺ΂ͯSwiftUI͸ػೳ͕ෆ଍͍ͯ͠Δ
  12. 50 SwiftUIಋೖલͷݕ౼݁Ռ 1. αϙʔτΛiOS13.0Ҏ্ʹͰ͖Δ͔ʁ ◦ શମతɾεϖʔεϚʔέοτΞϓϦͷར༻ঢ়گΛؑΈͯɺ 
 iOS13.0ʹ͋͛Δ͜ͱ͕Մೳ 2. SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ

    ◦ ࢖༻͢ΔAPIͳͲ֬ೝΛߦ͍ɺ࣮૷ͷ૝ఆ͕Ͱ͖ͨ ◦ UIKitͱซ༻࣮ͨ͠૷Λߦ͏͜ͱͰɺͰ͖Δ͚ͩϦεΫΛԼ࣮͛ͨ૷͕Ͱ͖Δ ◦ ৽͍͠ϗʔϜը໘͸iOS14Ҏ্ͰରԠ͢ΔΑ͏ʹ͢Δ 3. ϝϦοτ͕͋Δ͔ʁ ◦ UIߏஙͷ࡞ۀޮ཰޲্͕ݟࠐΊΔ ◦ σβΠφʔͱͷ࡞ۀ෼୲΋Ͱ͖ͦ͏ ◦ কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮༻ྫ͕Ͱ͖Δ OK OK OK
  13. 51 SwiftUIಋೖલͷݕ౼݁Ռ 1. αϙʔτΛiOS13.0Ҏ্ʹͰ͖Δ͔ʁ ◦ શମతɾεϖʔεϚʔέοτΞϓϦͷར༻ঢ়گΛؑΈͯɺ 
 iOS13.0ʹ͋͛Δ͜ͱ͕Մೳ 2. SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ

    ◦ ࢖༻͢ΔAPIͳͲ֬ೝΛߦ͍ɺ࣮૷ͷ૝ఆ͕Ͱ͖ͨ ◦ UIKitͱซ༻࣮ͨ͠૷Λߦ͏͜ͱͰɺͰ͖Δ͚ͩϦεΫΛԼ࣮͛ͨ૷͕Ͱ͖Δ ◦ ৽͍͠ϗʔϜը໘͸iOS14Ҏ্ͰରԠ͢ΔΑ͏ʹ͢Δ 3. ϝϦοτ͕͋Δ͔ʁ ◦ UIߏஙͷ࡞ۀޮ཰޲্͕ݟࠐΊΔ ◦ σβΠφʔͱͷ࡞ۀ෼୲΋Ͱ͖ͦ͏ ◦ কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮༻ྫ͕Ͱ͖Δ OK OK OK SwiftUIಋೖ΁ࢸΓɺ ແࣄෆ۩߹΋ͳ࣮͘૷Λߦ͏͜ͱ͕ Ͱ͖·ͨ͠🙌
  14. 53 ·ͱΊ • SwiftUIͷಋೖʹ͍ͭͯ ◦ ϝϦοτ ▪ UIKitͱ૊Έ߹ΘͤͯॊೈʹରԠͰ͖Δ ▪ UIߏஙʹؔͯ͠࡞ۀޮ཰UP͕ݟࠐΊΔ

    ▪ কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮ྫ͕Ͱ͖Δ ◦ σϝϦοτ ▪ UIKitͱൺ΂ͯ଍Γͳ͍ػೳ͕ଟʑ͋Δ ▪ iOS13Ͱͷ࣮૷͸޻෉͕ඞཁ 
 ʢiOS14αϙʔτޙʹಋೖͨ͠ํ͕҆ఆ͢Δͱࢥ͍·͢ʣ
  15. 54 ·ͱΊ • ͜Ε͔Β ◦ αϙʔτόʔδϣϯͷϝϯςφϯεΛܧଓతʹߦ͏͜ͱ͕େࣄ ▪ SwiftUI࢖༻͢Δɾ͠ͳ͍ʹؔΘΒͣɺศརͳAPI͕࢖༻Ͱ͖Δ ◦ WWDC21Ͱ৽ͨʹ࢖༻Ͱ͖ΔAPI͕ެ։͞Εɺࠓޙ΋࢖͍উख͕ྑ͘ͳΔ

    ▪ ࠷৽ٕज़΁ͷΩϟονΞοϓͯ͠ɺΑΓྑ͍ϓϩμΫτΞοϓσʔτ΁ʂ • ΑΓৄ͍͠಺༰͸ͪ͜Β ◦ SwiftUIͰ࣮૷ͨ͠৽͍͠ϗʔϜը໘ΛϦϦʔε͠·ͨ͠ ◦ SwiftUIͰΧϧʔηϧΛ࣮૷͢Δ