Share
Embed
What's new in SwiftData + SwiftData Group Lab Recap
WWDC26 - Japan-\(region).swift 登壇資料
1mash0
July 18, 2026
Transcript
18 slides
-
5PQJDT w 4XJGU%BUBͷ৽ػೳհ w TFDUJPO#Z w !"UUSJCVUF DPEBCMF w
3FTVMUT0CTFSWFS w )JTUPSZ0CTFSWFS w 4XJGU%BUB(SPVQ-BC -
struct TripListView: View { @Query(sectionBy: \Trip.destination) var trips: [Trip] var
body: some View { List(selection: $selection) { if _trips.sections.isEmpty { ForEach(trips) { trip in ... } } else { ForEach(_trips.sections) { section in Section(section.id) { ForEach(section) { trip in ... } } } } } } } -
!"UUSJCVUF DPEBCMF w 4XJGU%BUB͕ѻ͑ͳ͍$PEBCMFܕΛɺܕࣗͷFODPEFEFDPEFΛͬͯอଘ͢Δ w ྫɿ.BQ,JUͷ.,.BQ*UFN*EFOUJ fi FS w ͨͩ͠ɺ੍͋Δ
w 4XJGU%BUB͔Βͷ෦ߏෆಁ໌ w 1SFEJDBUFͰͷϑΟϧλϦϯάɺ4PSU%FTDSJQUPSͰͷιʔτͰ͖ͳ͍ w ϓϩύςΟͷՃআͳͲɺϚΠάϨʔγϣϯىಈ͠ͳ͍ w ࣗͰఆٛͨ͠ܕ༻Λආ͚Δ͖ -
4PSU%FTDSJQUPS let sortDescriptor = SortDescriptor<Trip>(\.mapItemIdentifier?.rawValue) let descriptor = FetchDescriptor<Trip>(sortBy: [sortDescriptor])
let trips = try modelContext.fetch(descriptor) 1SFEJDBUF let predicate = #Predicate<Trip> { trip in trip.mapItemIdentifier?.rawValue == "I78E51C9F47CC4F7B" } let descriptor = FetchDescriptor<Trip>(predicate: predicate) let trips = try modelContext.fetch(descriptor) !"UUSJCVUF DPEBCMF -
4PSU%FTDSJQUPS let sortDescriptor = SortDescriptor<Trip>(\.mapItemIdentifier!.rawValue) let descriptor = FetchDescriptor<Trip>(sortBy: [sortDescriptor])
let trips = try modelContext.fetch(descriptor) 1SFEJDBUF let predicate = #Predicate<Trip> { trip in trip.mapItemIdentifier!.rawValue == "I78E51C9F47CC4F7B" } let descriptor = FetchDescriptor<Trip>(predicate: predicate) let trips = try modelContext.fetch(descriptor) ͲͪΒGFUDI࣌ʹ࣮ߦ࣌Τϥʔ Thread 1: Fatal error: Failed to validate \Trip.mapItemIdenti fi er!.rawValue because rawValue is not a member of MKMapItemIdenti fi er !"UUSJCVUF DPEBCMF -
3FTVMUT0CTFSWFS w !2VFSZͱಉ༷ʹσʔλΛऔಘ͠ɺετΞͷมߋΛࢹ͢Δ w ಉҰ.PEFM$POUFYUͷมߋ w ಉҰ.PEFM$POUBJOFSͷผ$POUFYUʹΑΔมߋ w ผϓϩηε$MPVE,JUಉظʹΑΔมߋ w
4XJGU6*7JFXʹґଘͤͣɺΞϓϦͷͲ͜Ͱར༻Ͱ͖Δ w fi MUFSTPSUTFDUJPO#ZʹରԠ w XJUI$POUJOVPVT0CTFSWBUJPO͕ฦ͢5PLFOΛอ࣋ͯ͠ࢹΛܧଓ͢Δ -
@Observable @MainActor final class MapCameraController { private let resultsObserver: ResultsObserver<Trip,
Never> var bounds: MapCameraBounds? private var token: ObservationTracking.Token? init(modelContext: ModelContext) throws { resultsObserver = try ResultsObserver<Trip, Never>(modelContext: modelContext) token = withContinuousObservation(options: [.didSet]) {[weak self], event in self?.bounds = self?.calculateBounds(trips: resultsObserver.results) } } private func calculateBounds(trips: [Trip]) -> MapCameraBounds? { / * */ } } 3FTVMUT0CTFSWFS -
@SyncActor final class ServerSync { private let observer: HistoryObserver private
var token: ObservationTracking.Token? func start() throws { self.observer = try HistoryObserver(authors: ["App"], modelContainer: modelContainer) token = withContinuousObservation(options: .didSet) {[weak self] _ in _ = self?.observer.eventCounter self?.processChanges() } } private func processChanges() { // Fetch and process history transactions } } )JTUPSZ0CTFSWFS -
4XJGU%BUB(SPVQ-BC 2େنͳσʔληοτΛѻ͏ࡍͷΞϓϩʔν w ʮେنʢMBSHFʣʯͷҙຯΛ໌֬ʹఆٛ͢Δ w Ϩίʔυ͕ଟ͍Ϟσϧ͝ͱͷσʔλྔ͕େ͖͍Ϟσϧ͕ଟ͍ w Ϩίʔυ͕ଟ͍ w 1SFEJDBUF*OEFYGFUDI-JNJUͰऔಘྔΛ੍ݶ͢Δ
w Ϟσϧ͝ͱͷσʔλྔ͕େ͖͍ w FYUFSOBM4UPSBHFΛར༻͢Δ w େྔͷϞσϧΛऔΓࠐΉ w ໋ͳ.PEFM$POUFYUΛ༻ͯ͠ɺখ͞ͳόονʹׂ͢Δ -
·ͱΊ w ηΫγϣϯΛ؆୯ʹදݱͰ͖ΔΑ͏ʹͳͬͨ w ʢ੍ݶ͋Δ͕ʣอଘͰ͖Δܕ͕૿͑ͨ w 4XJGU6*7JFX֎ͰɺσʔλཤྺͷมߋΛѻ͍͘͢ͳͬͨ w ʮେنʯͷछྨʹΑͬͯɺऔΔ͖Ξϓϩʔν͕ҟͳΔ w
·ͩ4XJGU%BUB͚ͩͰ݁Ͱ͖ͳ͍໘͋Δ w ͦͷ࣌$PSF%BUBͱͷซ༻બࢶ -
ࢀߟ w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPO$PSF%BUBBEPQUJOH TXJGUEBUBGPSBDPSFEBUBBQQ w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOTXJGUEBUBRVFSZTFDUJPOT
w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOTXJGUEBUBSFTVMUTPCTFSWFS w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOTXJGUEBUBIJTUPSZPCTFSWFS