在我的测试项目中,用户插入一个具有目的地机场和到达机场的航班,这是我的代码:
我的航班和机场之间的关系一定有问题,但不知道如何编写这种关系以及如何保存我的航班:
在以下代码中,用户选择出发机场和到达机场并保存它,出于某种不清楚的原因,在我选择例如 depApt“icao1”和到达机场“icao2”后,我保存了航班,但保存的航班已更改 dep 机场.
希望有人可以尝试以下代码:
import Foundation
import SwiftData
@Model
class Flight {
var id : UUID
@Relationship(deleteRule:.noAction, inverse: \Airport.flight) var departure : Airport?
@Relationship(deleteRule:.noAction, inverse: \Airport.flight) var arrival : Airport?
var timestamp: Date
init(id: UUID, departure: Airport? = nil, arrival: Airport? = nil, timestamp: Date) {
self.id = id
self.departure = departure
self.arrival = arrival
self.timestamp = timestamp
}
}
@Model
class Airport {
var id: UUID
@Attribute(.unique) var icao: String
var flight : Flight?
init(id: UUID, icao: String, flight: Flight? = nil) {
self.id = id
self.icao = icao
self.flight = flight
}
}
//ContentView:
struct ContentView: View {
@Environment(\.modelContext) private var mc
var body: some View {
TabView {
Flights()
.tabItem {
Label("Flights", systemImage: "airplane")
}
AirportsList()
.tabItem {
Label("Airports", systemImage: "house")
}
}
}
}
// Flight view
struct Flights: View {
@Environment(\.modelContext) private var mc
@Query var flights : [Flight]
@State var openSheet = false
@State var depApt : Airport?
@State var arrApt : Airport?
var body: some View {
NavigationStack{
List{
ForEach(flights) { flt in
HStack{
VStack(alignment:.leading){
Text("Departure")
Text(flt.departure?.icao ?? "")
}
Spacer()
VStack(alignment:.trailing){
Text("Arrival")
Text(flt.arrival?.icao ?? "")
}
}
}
}
.toolbar {
Button("Add") {
openSheet.toggle()
}
}
.sheet(isPresented: $openSheet, content: {
NavigationStack{
Form{
NavigationLink {
AirportsPick(picked: $depApt)
} label: {
Text("DEP ICAO:").foregroundStyle(.secondary)
Spacer()
Text(depApt?.icao ?? "")
}
NavigationLink {
AirportsPick(picked: $arrApt)
} label: {
Text("ARR ICAO:").foregroundStyle(.secondary)
Spacer()
Text(arrApt?.icao ?? "")
}
Button("Save") {
let flight = Flight(id: UUID(), departure: depApt, arrival: arrApt, timestamp: Date())
mc.insert(flight)
openSheet.toggle()
}.tint(.red)
}
}.onAppear(perform: {
depApt = nil
arrApt = nil
})
})
}
}
}
//Airport Pick
struct AirportsPick: View {
@Environment(\.modelContext) private var mc
@Environment(\.dismiss) private var dismiss
@Query var airports : [Airport]
@Binding var picked: Airport?
var body: some View {
NavigationStack{
List{
ForEach(airports) { apt in
Button {
picked = apt
dismiss()
} label: {
Text(apt.icao)
}
}
}
}
}
}
import SwiftUI
import SwiftData
struct AirportsList: View {
@Environment(\.modelContext) private var mc
@Query var airports : [Airport]
var body: some View {
NavigationStack{
List{
ForEach(airports) { apt in
Text(apt.icao)
}
}
.toolbar {
Button("Generate Airports") {
if airports.isEmpty{
addAirports()
}
}
}
}
}
func addAirports(){
for i in 1...10 { // make some fake airport
let icao = "ICAO: \(i)"
let airport = Airport(id: UUID(), icao: icao)
mc.insert(airport)
}
}
}
什么是机场?这是一个每天都有许多飞机起飞和到达的地方,所以你必须有很多航班才能到达机场。
@Model
class Airport {
var id: UUID
@Attribute(.unique) var icao: String
var flights : [Flight]
init(id: UUID, icao: String) {
self.id = id
self.icao = icao
self.flights = []
}
}
请注意,我们没有在 init 中包含关系的属性。
同时更改
Flight
型号
@Model
class Flight {
var id : UUID
@Relationship(deleteRule:.noAction, inverse: \Airport.flights) var departure : Airport?
@Relationship(deleteRule:.noAction, inverse: \Airport.flights) var arrival : Airport?
var timestamp: Date
init(id: UUID, timestamp: Date) {
self.id = id
self.departure = nil
self.arrival = nil
self.timestamp = timestamp
}
}