Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOS26時代の新規アプリ開発
Search
野瀬田 裕樹
May 20, 2026
Programming
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iOS26時代の新規アプリ開発
DMM.swift #5での発表資料
野瀬田 裕樹
May 20, 2026
More Decks by 野瀬田 裕樹
See All by 野瀬田 裕樹
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
340
Human Interface Guidelines 2
yuukiw00w
0
69
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
280
HIG学習用スライド
yuukiw00w
0
200
FlutterKaigi 2025: What is iOS Assistive Access? UI considerations for Flutter
yuukiw00w
0
63
Swift6.2時代のconcurrencyを考える会
yuukiw00w
2
1.7k
実践!App Intents対応
yuukiw00w
1
500
App Intents再入門
yuukiw00w
0
91
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
290
Other Decks in Programming
See All in Programming
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
360
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.8k
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
310
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
580
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
300
自作OSでスライド発表する
uyuki234
1
3.7k
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
7
3.5k
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
470
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
どこまでゆるくて許されるのか
tk3fftk
0
460
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
810
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
210
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
Technical Leadership for Architectural Decision Making
baasie
3
440
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
It's Worth the Effort
3n
188
29k
We Have a Design System, Now What?
morganepeng
55
8.2k
Practical Orchestrator
shlominoach
191
11k
Transcript
J04࣌ͷ৽نΞϓϦ։ൃ ాɹ༟थʢ!ZOPTFEBʣ
4QFBLFS ాɹ༟थʢ!ZOPTFEBʣ ϞόΠϧશൠͬͯ·͢ ʢJ04"OESPJE'MVUUFSʣ
J04࣌ͱͲΜͳ࣌ʁ w -JRVJE(MBTT࣌Ͱʮ6*ͷ04ࠩʯ͕࠶֦େͨ͠ w 9DPEF4XJGU͕"*ओಋ։ൃͰ͍͍͢ͷʹͳ͖ͬͯͨ
-JRVJE(MBTT࣌ w J04ͱ"OESPJEͰશʹผ6*ͷํੑͱͳͬͨ w -JRVJE(MBTTίϯςϯπΛॏࢹͯ͠ φϏήʔγϣϯपΓΛཱͨͳͤ͘͞Δ w Ұํɺ.BUFSJBM%FTJHO&YQSFTTJWFͰൃݟ༰қੑͷͨΊ φϏήʔγϣϯཱ͕ͭ͠ɺಈ͖ϙοϓͰܹ͍͠
04ʹدΓఴͬͨ 6*࣮ͷॏཁੑ্͕͕ͬͨ
"*࣌ w ެࣜඇެࣜΘ༷ͣʑͳ"*ओಋ։ൃͷͨΊͷπʔϧ͕ἧ͖ͬͯͨ w 9DPEF#VJME.$1 YDPEFUPPMT.$1ͳͲͷศརͳ.$1 w 9DPEFͷ$PEJOH*OUFMMJHFODFػೳ w "WE-FF4XJGU6*"HFOU4LJMMͳͲͷศརͳ4LJMM
"*࣌ w "*͕͍ͬͯ͡յΕʹ͍͘ඇಉظॲཧͷ࣮ݱ͕༰қʹ w 4XJGUͰ"QQSPBDIBCMF$PODVSSFODZ͕ͱͯศར w 4XJGUͳΒྫ֎ͷѻ͍࿙Εͳ͍͠ɺ Ϗϧυ͕௨͍ͬͯͯมͳ࣮ʹͳ͍ͬͯͳ͚Ε ͋Δఔ҆৺Ͱ͖Δڥ͕͍ͬͯΔ
࣮ίετ͕Լ͕Γɺ ମݧͷٻ͕͘͢͠ͳͬͨ
ͦΜͳ࣌ʹ ৽نΞϓϦΛ࡞ΔͳΒʁ
J04࣌ͷ՝ w ࣮͕"*ʹΑΓࢦؔతʹ্ w ࣌ؒతʹਓ͕ؒϘτϧωοΫʹͳΓɺ ҰํͰ"*Λ͏΄Ͳ͓͕ۚඈΜͰ͍࣌͘ w ਓ͕ؒཧղɺೝ͢Δ্ͤ͞ʹ͍ͨ͘Ίɺ VOLOPXOVOLOPXOྖҬ͕ࢦؔతʹ૿େ
"*ͱਓؒͷ྆ํʹͱͬͯ ΑΓྑ͍ڠۀڥΛߏங͢Δ
"*ͷಛੑ w "*ඇܾఆੑΛ࣋ͭͨΊɺҰఆͷ֬Ͱϛε͕͋Δ w "*ͱରͭͭ͠ࡉ͔͘ਓ͕ཧ͢Ε੍ޚͰ͖Δ͕εέʔϧ͠ͳ͍ w ҰํͰ"*ʹҕୗ͢Δܗʹͯ͠λεΫαΠζΛେ͖͍ͯ͘͘͠ͱɺ εέʔϧ͢Δ͕ޡΓͷࠞೖϦεΫ͕૿େɺৄࡉͷѲ߹͍͕Լ w ޡΓͷݮͱཧղͷଅਐΛଅ͢Έڥ͕"*ʹඞཁ
J04࣌ͷઃܭͷཁ w "*͕҆શʹมߋͰ͖Δ w ਓ͕ؒཧղΛҡ࣋͠ɺೝෛ࠴ΛݮͰ͖Δ w ΨʔυϨʔϧઃܭͱཧղ༰қੑ͕ઃܭͷཁʹͳͬͨ
ཧղͷෆʢʹೝෛ࠴ʣ w ཧղෛ࠴ɿઃܭΛཧղͤͣͱେྔͷ࣮͕Ͱ͖ΔΑ͏ʹͳͬͨ w ҙਤෛ࠴ɿͦ͏ͯ͠ੜ͞Ε࣮͚͕ͨͩ͞ΕΔͱɺ ɹɹɹɹɹจ຺͕ফ͑ͯͦͷഎܠʹ͋ΔҙਤΛѲͰ͖ͳ͘ͳΔ
ཧղͷෆʢʹೝෛ࠴ʣ w "*ͷࣗ༝ʹͤ͞Δͱɺ ҉͕ࣦΘΕɺ ΤϯδχΞͷ಄ͷதͷϝϯλϧϞσϧߏங͞Εͣɺ ίʔυͷΛ࣋ͯΔਓ͕͍ͳ͘ͳΓɺ ࣭ͷίʔυ͕େྔੜ࢈͞ΕΔՄೳੑ͕͋Δ
"*ͱਓͱͷׂ୲ w ཧղ͕༰қͳখ͍͞λεΫ"*ʹҕୗ w ཧղίετͷߴ͍λεΫ"*ͱڠಇ w "*ϨϏϡʔʹΑΔඇ੩తͳ࣭ήʔτ ʢ͓Αͼ$*ʹΑΔ੩తͳ࣭ήʔτʣ w ਓؒϨϏϡʔʹΑΔҙਤৄࡉͷѲɺϝϯλϧϞσϧߏஙͱडೖ
࣭ήʔτɿޡΓͷରࡦ w ੩తͳ࣭ήʔτɿϏϧυ$*໘ͷڧԽ ɹɹɹɹɹɹɹɹɹʢઃఆؔɺ-JOUɺΧόϨοδ੍ͳͲʣ w ඇ੩తͳ࣭ήʔτɿ"*ϨϏϡʔͷڧԽʢ؍ͷཧͳͲʣ
Ϗϧυ$*໘ͷڧԽ w ઃఆ໘Ͱͷ࠷దԽʢ"*͕ࡶͳฒߦॲཧΛॻ͖ʹ͍͘ઃఆʹͰ͖Δʣ w TXJGU-BOHVBHF.PEF W w 4XJGUͷ"QQSPBDIBCMF$PODVSSFODZઃఆͷ༗ޮԽ w
USFBU"MM8BSOJOHT BTFSSPS ͰܯࠂΛΤϥʔԽ
ઃఆͷྫ extension SwiftSetting { static let existentialAny: Self = .enableUpcomingFeature("ExistentialAny")
static let internalImportsByDefault: Self = .enableUpcomingFeature("InternalImportsByDefault") static let memberImportVisibility: Self = .enableUpcomingFeature("MemberImportVisibility") static let inferIsolatedConformances: Self = .enableUpcomingFeature("InferIsolatedConformances") static let nonisolatedNonsendingByDefault: Self = .enableUpcomingFeature("NonisolatedNonsendingByDefault") static let immutableWeakCaptures: Self = .enableUpcomingFeature("ImmutableWeakCaptures") /// ਪͷઃఆҰࣜΛఆٛͯͦ͠ΕͧΕͷtargetͰࢦఆ͢Δ static let defaultSettings: [Self] = [ .existentialAny, .internalImportsByDefault, .memberImportVisibility, .inferIsolatedConformances, .nonisolatedNonsendingByDefault, .immutableWeakCaptures, .swiftLanguageMode(.v6), .treatAllWarnings(as: .error) ] }
Ϗϧυ$*໘ͷڧԽ w -JOUܥͷઃఆʢTXJGUGPSNBUMJOU4XJGU-JOUͷ׆༻ʣ w TXJGUGPSNBUͰϑΥʔϚοτΛڧ੍ w TXJGUGPSNBUMJOU͋Δ͍4XJGU-JOUͰઃܭͷڧ੍
Ϗϧυ$*໘ͷڧԽ w ϚϧνϞδϡʔϧԽʹΑΔࢀরํͷڧ੍ w "QQ%PNBJO%BUB4PVSDF֎෦ґଘ܈ͷߏͷ MBZFSFENPEVMFߏʹ͢ΔͱࢀরํΛڧ੍Ͱ͖Δ w ςετ༰қੑͷͨΊͳΒ %BUB4PVSDF֎෦ґଘؒͰ͚ͩґଘੑٯసͤ͞Δ͚ͩͰ͍͍ w
6*ܥҰͭͷϞδϡʔϧʹ·ͱΊΔͱɺ BTTFU౷߹͕ෆཁͰΫϦʔϯϏϧυ͕࣌ؒ͘ͳ͍͍ͬͯײ͡
Ϗϧυ$*໘ͷڧԽ w ֎෦ґଘ6*Λআ͘UBSHFUͷίʔυΧόϨοδͷ੍ w ֎෦ґଘΛഉআͨ͠%PNBJO %BUB4PVSDFͷϞδϡʔϧ ίʔυΧόϨοδ͕ҰఆҎ্Ͱͳ͍ͱ$*͕མͪΔΑ͏ʹઃఆ w %PNBJO %BUB4PVSDF͔Β֎෦ґଘΛഉআ͢Δͱɺ
-JOVYڥͰTXJGUCVJMEͰ͖ΔΑ͏ʹߏஙͰ͖Δ w %FWJO(JU)VC$PQJMPUͷBHFOUͳͲ-JOVYڥͷ"*Ͱɺ ϩδοΫपΓͷݕূ͕Ͱ͖ΔΑ͏ʹͳΔ
Ϟδϡʔϧߏͷ࣮ͷྫ let appleTargets: [PackageDescription.Target] = [ .target( name: Target.firebaseClient.name, dependencies:
[ Target.dataSource.dependency, ], ), .target( name: Target.app.name, dependencies: [ Target.dataSource.dependency, Target.domain.dependency, Target.firebaseClient.dependency, ], resources: [ .process("Resources/Assets.xcassets"), .process("Resources/Localizable.xcstrings") ], ), ]
Ϟδϡʔϧߏͷ࣮ͷྫ let commonTargets: [PackageDescription.Target] = [ .target(name: Target.api.name), .target(name: Target.dataSource.name,
dependencies: [Target.api.dependency]), .target(name: Target.domain.name, dependencies: [Target.dataSource.dependency]), .testTarget( name: TestTarget.dataSourceTests.name, dependencies: [Target.dataSource.dependency, Target.api.dependency], ), .testTarget( name: TestTarget.domainTests.name, dependencies: [Target.domain.dependency], ), ]
Ϟδϡʔϧߏͷ࣮ͷྫ let isApplePlatform: Bool = { #if os(macOS) ProcessInfo.processInfo.environment["DISABLE_APPLE_TARGETS"] !=
"1" #else false #endif }() let appCoreProduct: Product = .library( name: "AppCore", type: .dynamic, targets: [Target.api.name, Target.dataSource.name, Target.domain.name] )
Ϟδϡʔϧߏͷ࣮ͷྫ let package = Package( name: "AppPackages", defaultLocalization: "ja", platforms:
[.iOS(.v26)], products: [appCoreProduct] + (isApplePlatform ? [appProduct] : []), dependencies: isApplePlatform ? [.package(...)] : [], targets: commonTargets + (isApplePlatform ? appleTargets : []) )
"*ϨϏϡʔͷڧԽ w $PEF3BCCJU$PQJMPUͳͲ"*Λ׆༻ͯ͠ޡΓΛݕ w ઃܭ࣮໘ͷϨϏϡʔɺٕज़తͳෛ࠴ͷݕͳͲ w ༷໘ͷϨϏϡʔɺΞΫηγϏϦςΟ༷ͱͷᴥᴪͷݕͳͲ w 2"؍ͷϨϏϡʔɺҟৗܥ੬ऑੑ؍ͳͲͷߟྀ࿙ΕݕͳͲ
ਓؒϨϏϡʔͷ࠶ߏங w ࣭ήʔτͱͯ͠ͷϨϏϡʔ͔Βɺ VOLOPXOVOLOPXOྖҬΛݮ͢Δ ཧղͷͨΊͷϨϏϡʔͱͯ͠࠶ߏங͢Δ w ઃܭҙਤͷཧղ࣮ͷཧղʹΑΔϝϯλϧϞσϧ֫ಘ w ཁ݅ͷѲड͚ೖΕɺ"%3ʹΑΔҙਤจ຺ͷܧঝ
·ͱΊ w J04࣌ΨʔυϨʔϧઃܭͱཧղ༰қੑͷͨΊͷઃܭ͕ඞཁ w 4XJGUͷ҆શੑΛ࠷େݶʹ׆͔ͨ͠ΨʔυϨʔϧઃܭΛߦ͓͏ w ೝෛ࠴Λੜ·ͳ͍ͨΊͷΛΓࠐ͏