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

What's new in SwiftData + SwiftData Group Lab R...

What's new in SwiftData + SwiftData Group Lab Recap

WWDC26 - Japan-\(region).swift 登壇資料

Avatar for 1mash0

1mash0

July 18, 2026

More Decks by 1mash0

Other Decks in Technology

Transcript

  1. 5PQJDT w 4XJGU%BUBͷ৽ػೳ঺հ w TFDUJPO#Z w !"UUSJCVUF DPEBCMF  w

    3FTVMUT0CTFSWFS w )JTUPSZ0CTFSWFS w 4XJGU%BUB(SPVQ-BC 
  2. 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 ... } } } } } } } 
  3. !"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 ࣗ෼Ͱఆٛͨ͠ܕ͸࢖༻Λආ͚Δ΂͖ 
  4. 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 
  5. 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 
  6. 3FTVMUT0CTFSWFS w !2VFSZͱಉ༷ʹσʔλΛऔಘ͠ɺετΞͷมߋΛ؂ࢹ͢Δ w ಉҰ.PEFM$POUFYU಺ͷมߋ w ಉҰ.PEFM$POUBJOFS಺ͷผ$POUFYUʹΑΔมߋ w ผϓϩηε΍$MPVE,JUಉظʹΑΔมߋ w

    4XJGU6*7JFXʹґଘͤͣɺΞϓϦͷͲ͜Ͱ΋ར༻Ͱ͖Δ w fi MUFSTPSUTFDUJPO#ZʹରԠ w XJUI$POUJOVPVT0CTFSWBUJPO͕ฦ͢5PLFOΛอ࣋ͯ͠؂ࢹΛܧଓ͢Δ 
  7. @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
  8. @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