Mein Anwendungsfall ist auf dem folgende Modell zugrunde:Ist es möglich, eine bidirektionale Beziehung zwischen zwei Strukturen mit nur konstanten Eigenschaften zu implementieren?
struct Person {
let name: String
let houses: [House]
}
struct House {
let owner: Person
}
Jetzt, im Idealfall würde Ich mag eine bidirektionale Beziehung aufrecht zu erhalten, die jedes Haus hat genau einen Eigentümer erfordert, wo ein Eigentümer auch alle seine Häuser wissen sollte.
Mit den oben genannten Datenstrukturen ist es möglich, Instanzen von House
und Person
so zu erstellen, dass es eine Beziehung zwischen den beiden gibt und die Objekte im Wesentlichen aufeinander zeigen?
Ich denke, die Formulierung dieser ist schon etwas irreführend, weil sie aufgrund der Wertesemantik von struct
s nicht wirklich irgendwo zeigen, sondern nur Kopien von Werten halten. Es scheint, als ob es offensichtlich sein sollte, dass es nicht möglich ist, diese beiden Objekte mit einer bidirektionalen Beziehung zu erstellen, aber ich wollte trotzdem sicher sein und diese Fragen hier stellen!
struct Person {
let name: String
var houses: [House]
init(name: String, houses: [House]) {
self.name = name
self.houses = houses
self.houses = houses.map { (house: House) in
var newHouse = house
newHouse.owner = self
return newHouse
}
}
}
struct House {
var owner: Person
init(owner: Person) {
self.owner = owner
var newHouses = self.owner.houses
newHouses.append(self)
self.owner = Person(name: owner.name, houses: newHouses)
}
}
Was aber, wenn ich:
Eine offensichtliche Lösung wäre auch houses
und owner
Variablen statt let
mit var
zu machen, wenn sie zu deklarieren, dann könnte die Beziehung in der initializer jedes struct
gehalten werden wollen houses
und owner
konstant halten? Wie ich schon sagte, es ist offensichtlich, dass es nicht möglich ist, aber ich frage mich, ob es einen ausgefallenen (vielleicht funktionalen) Weg gibt, dies zu erreichen? Ich dachte über lenses, die als Getter und Setter verwendet werden können, wenn es um unveränderliche Modelle geht.
Ich würde dringend davon abraten, irgendwelche * "wirklich selbstreferentiellen" * In-Memory-Datenstrukturen zu erstellen ... in Swift oder in einer anderen Programmiersprache. Warum? Weil es dem Speichermanager sehr schwer fällt: Es kann aufgrund von Zirkelverweisen zu "Speicherlecks" kommen. Außerdem: Mach diese "nur Strukturen" nicht. Lass sie die "Objekte" sein, die sie natürlich sind. –