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

ABEMA iOS 大規模プロジェクトにおける段階的な技術刷新 / ABEMA iOS Tec...

ABEMA iOS 大規模プロジェクトにおける段階的な技術刷新 / ABEMA iOS Technology Upgrade

ABEMAではKotlin Multiplatformの本格採用を加速させつつ、ネイティブ実装部分をSwiftUIやSwift Concurrencyといったモダンな技術スタックに移行するため、プロジェクトを新たに作成して画面単位で移行する長期的なプロジェクトが進んでいます。 この発表では移行プロジェクトの概要と、主にSwift 6についての対応方針やXcode Playgroundを活用したキャッチアップの取り組みについてご紹介します。

https://cyberagent.connpass.com/event/342952/

Akio Yasui

March 03, 2025
Tweet

More Decks by Akio Yasui

Other Decks in Programming

Transcript

  1. എܠ ,PUMJO.VMUJQMBUGPSNͷಋೖ w ೥͝Ζ͔Β,PUMJO.VMUJQMBUGPSNͷಋೖݕূΛ։࢝ ˠຊ֨ಋೖΛܾఆ w ೥ݱࡏɺJ04ଆΛؚΊͨ΄ͱΜͲͷϞόΠϧΤϯδχΞ͕ ,PUMJO.VMUJQMBUGPSNͷڞ௨࣮૷΋ؚΊͯ։ൃ͍ͯ͠Δ "#&."ϞόΠϧΞϓϦ։ൃͷ%FW0QTઓུ 

     IUUQTDBEDDZCFSBHFOUDPKQQSPHSBNBCFNBNPCJMFBQQEFWPQT AbemaTV, Inc. All Rights Reserved
 1 .VMUJQMBUGPSN&OHJOFFSJOH3PBENBQGPSUIF'VUVSF   IUUQTEFWFMPQFSBCFNBJPTFTTJPOTCWKQX+&P(1
  2. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ ,.1 ڞ௨࣮૷ طଘ࣮૷ ґଘϥΠϒϥϦ $PDPB1PET ৽ϓϩδΣΫτ ґଘϥΠϒϥϦ 4XJGU1.

    BCFNBJPT BCFNBOBUJWF ৽ϓϩδΣΫτͰ͸ େ෦෼Λ,.1Ͱڞ௨Խ͢Δ લఏͷઃܭɾ࣮૷ʹدͤΔ  4XJGU1.ɺ$PODVSSFODZͳͲ ৽نٕज़ελοΫͷಋೖ
  3. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ ,.1 ڞ௨࣮૷ طଘ࣮૷ ґଘϥΠϒϥϦ $PDPB1PET ৽ϓϩδΣΫτ ґଘϥΠϒϥϦ 4XJGU1.

    BCFNBJPT BCFNBOBUJWF ❌ ৽ϓϩδΣΫτ͔Β طଘ࣮૷ʹ͸ ΞΫηεͰ͖ͳ͍  ˠچ࣮૷͕ ࢒Γଓ͚ΔͷΛ๷͙
  4. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ ,.1 ڞ௨࣮૷ طଘ࣮૷ ґଘϥΠϒϥϦ $PDPB1PET ৽ϓϩδΣΫτ ґଘϥΠϒϥϦ 4XJGU1.

    BCFNBJPT BCFNBOBUJWF طଘ࣮૷͔Β 4XJGU1.ͷґଘ΋࢖͑Δ  ˠੵۃతʹґଘ؅ཧΛ ҠߦͰ͖ΔΑ͏ʹ
  5. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ BCFNBJPT BCFNBOBUJWF طଘ࣮૷ public class NewViewController:
 UIViewController {

    ... } public struct NewView: View { ... } طଘϓϩδΣΫτ͸ը໘୯ҐͰ ৽ϓϩδΣΫτͷ࣮૷Λར༻  ˠطଘͷϧʔςΟϯάʹ૊ΈࠐΈ΍͘͢
  6. ৽ϓϩδΣΫτͷٕज़ελοΫ w 4XJGU1BDLBHF.BOBHFS w طଘͷ$PDPB1PET͔Βஈ֊తʹґଘΛҠߦத w ΞϓϦ಺ͷϞδϡʔϧఆٛʹ͸࢖༻͍ͯ͠ͳ͍ʢޙड़ʣ w 4XJGU6* w

    طଘͱͷܨ͗ࠐΈ΋౿·͑ͯɺϧʔςΟϯά͸6*,JUϕʔε ʢ6*7JFX$POUSPMMFSϕʔεʣͰߦ͏ w ֤ը໘୯ҐͰͷ6*࣮૷΍ঢ়ଶ؅ཧ͸4XJGU6*ϕʔε w 4XJGU6*ಋೖʹ͋ͨͬͯͷ޻෉͸ኍ઒͞Μͷηογϣϯʹͯ w $PODVSSFODZ w 4USJDU$IFDLJOH΋$PNQMFUFͰӡ༻தʢޙड़ʣ
  7. ৽ϓϩδΣΫτͷٕज़ελοΫ 4XJGU1BDLBHF.BOBHFS w αʔυύʔςΟʔϥΠϒϥϦ΁ͷґଘͳͲΛ$PDPB1PET͔ΒҠߦத w ΞϓϦ಺ͷϞδϡʔϧఆٛʹ΋࢖༻͍ͯͨ͠ ˠطଘͱಉ͘͡9DPEF(FOʹΑΔఆٛʹ໭ͨ͠ w ,PUMJO.VMUJQMBUGPSNͱͷ૬ੑ໰୊ʢݕূ౰࣌ʣ w

    ,.1ଆ΋౎౓Ϗϧυ͍͕ͨ͠ɺ4XJGU1.Ͱ͸੍໿͕ଟ͍ ʢ#VJME5PPMͰ͸ϑϨʔϜϫʔΫ͸ੜ੒ɾࢀরͰ͖ͳ͍ɾ (SBEMFͷ࣮ߦʹඞཁͳωοτϫʔΫΞΫηεͳͲΛڐՄͰ͖ͳ͍ʣ w 9DPEFଆͷ1SFCVJME"DUJPOͰ9$'SBNFXPSLΛੜ੒ͯ͠ࢀর͢Δ͔͠ ͳ͍ ˠϏϧυ͕ෆ҆ఆʹͳΔ໰୊͕͋ͬͨ w طଘϓϩδΣΫτଆʹ΋໰୊͕೾ٴͨ͠ w %FCVH3FMFBTFͰґଘΛ੾Γସ͑ΒΕͳ͍ʢະ࣮૷ʣ
  8. ҠߦϓϩδΣΫτͷਐΊํ $PODVSSFODZ w طଘϓϩδΣΫτʹ͓͚ΔରԠํ਑ w 4XJGUϞʔυͰӡ༻͠ɺ$PODVSSFODZ͸ੵۃతʹ͸ಋೖ͠ͳ͍ w ޿ൣʹར༻͍ͯ͠Δ3Y4XJGUͳͲͱซ༻͢ΔܗͰӡ༻͢Δͷ͸ ೉қ౓͕ߴ͍ w

    ˠಘΒΕΔԸܙʹରͯ͠ɺ݁ՌతʹෳࡶԽͨ͠Γෆ҆ఆͳ࣮૷ʹͳΔ ϦεΫ͕େ͖͍ w طଘϓϩδΣΫτ಺ͰͷҠߦΑΓ΋ɺ৽ϓϩδΣΫτ΁ͷҠߦΛ ༏ઌ͢Δ
  9. ҠߦϓϩδΣΫτͷਐΊํ $PODVSSFODZ w ৽ϓϩδΣΫτʹ͓͚ΔରԠํ਑ w 4XJGUϞʔυʹ͸Ͱ͖͍ͯͳ͍ʢҰ౓༗ޮԽͨ͠ޙʹແޮԽʣ w ,.1͕ੜ੒ͨ͠0CKFDUJWF$ϑϨʔϜϫʔΫʹ౉ͨ͠Ϋϩʔδϟ͕ ݺͼग़͞Εͨͱ͖ɺ4XJGUϥϯλΠϜ͕Ϋϥογϡ͢Δ৔߹͕͋Δ w

    ࢀߟIUUQTBQMVTSTPCKFDUJWFDDBMMCBDLDSBTIFTTXJGU w ˠ4XJGUϞʔυʹ໭ͭͭ͠ɺ4XJGUͰ ༗ޮʹͳΔ6QDPNJOH'FBUVSFTΛ શͯΦϯʹͯ͠ӡ༻த ʢ4USJDU$IFDLJOH$PNQMFUFΛؚΊͯʣ w ,PUMJOͷ4XJGUFYQPS t ʹظ଴ʁ
  10. ৽ϓϩδΣΫτͷٕज़ελοΫ $PODVSSFODZରԠํ਑ w ४ڌͰ͖Δσʔλܕ͸Sendableʹ४ڌͤ͞Δ w 6*ؔ࿈ͷܕ΍ॲཧ͸@MainActorΛ෇༩͢Δ w 6*ͷঢ়ଶ؅ཧͳͲΛεϨουηʔϑʹ࣮૷͢ΔϝϦοτΑΓ΋ ࣮૷ෛ୲ͷܰݮΛʢݱঢ়Ͱ͸ʣ༏ઌ͢Δ w

    4XJGU͕ಋೖ͞Ε͍ͯͳ͍֎෦ϥΠϒϥϦΛ࢖͏ࡍͷରԠखஈ w MainActorͷΈ͔ΒΞΫηε͢Δ w Sendableʹ४ڌͤ͞Δ w SendableͳܕͰϥοϓ͢Δ w nonisolated(unsafe) letม਺Λఆٛ͢Δ w ʢ࠷ऴखஈͱͯ͠ʣ@preconcurrency importΛ࢖͏
  11. ৽ϓϩδΣΫτͷٕज़ελοΫ $PODVSSFODZӡ༻্ͷ޻෉ w TaskBagܕͷಋೖ w 3Y4XJGUͷDisposeBagͱಉ༷ͷ ࢖͍উखͰTaskΛ؅ཧ w 5BTL#BHͰ͸ @_implicitSelfCaptureଐੑΛ

    Ϋϩʔδϟʹ෇༩͠ͳ͍ w deinitىҼͰΩϟϯηϧ͍ͨ͠ ॲཧ͕selfͷ҉໧తͳΩϟϓνϟ ʹΑͬͯΩϟϯηϧ͞Εͳ͘ͳΔ ࣄ৅Λ๷͙
  12. ࠓޙͷऔΓ૊Έ w ҠߦϓϩδΣΫτͷਐߦ w ֤ը໘ͷ࣮૷΍ج൫࣮૷ɺґଘ؅ཧͷҠߦΛਐΊΔ w ϞϊϦϙδτϦԽ w ։ൃޮ཰Λߋʹ޲্ͤ͞ΔͨΊɺطଘϓϩδΣΫτ΋,.1࣮૷΍ ৽ϓϩδΣΫτͱಉ͡ϦϙδτϦʹҠ؅͢Δ

    w ௕ظతʹ͸"OESPJE΍UW04ͷϓϩδΣΫτ౷߹΋ࢹ໺ w ӡ༻ϙϦγʔɾΩϟονΞοϓࢿྉͷॆ࣮ w $PODVSSFODZͳͲ৽͍ٕ͠ज़ελοΫͷӡ༻࣮੷ΛੵΈͭͭɺ ஌ݟΛࢿྉԽ͍ͯ͘͠ w Ώ͘Ώ͘͸ࣾ֎ൃ৴΋ʜʁ