Мой случай использования основан на следующей модели:Возможно ли реализовать двунаправленное отношение между двумя структурами, используя только постоянные свойства?
struct Person {
let name: String
let houses: [House]
}
struct House {
let owner: Person
}
Теперь, в идеале я хотел бы поддерживать двунаправленную связь, которая требует, чтобы каждый дом, чтобы иметь ровно один владелец, где владелец должен также знать все свои дома.
Используя приведенные выше структуры данных, можно ли создавать экземпляры House
и Person
так, чтобы существовала взаимосвязь между ними, и объекты по существу указывали друг на друга?
Я предполагаю, что формулировка этого уже несколько вводит в заблуждение, потому что из-за семантики значения struct
s они на самом деле не указывают нигде, а содержат только копии значений. Похоже, должно быть очевидно, что невозможно создать эти два объекта с двунаправленными отношениями, но я все еще хотел быть уверенным и задавать здесь эти вопросы!
Очевидным решением было бы также сделать houses
и owner
переменные, используя var
вместо let
при объявлении их, то отношения могут быть сохранены в инициализаторе каждого struct
:
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)
}
}
Однако, что если я хотите сохранить houses
и owner
постоянной? Как я уже сказал, кажется очевидным, что это невозможно, но мне интересно, есть ли какой-то фантастический (возможно, функциональный) способ достичь этого? Я думал о lenses, который может использоваться как геттеры и сеттеры при работе с неизменяемыми моделями.
Я бы категорически отказался от создания каких-либо * действительно самореферентных * структур данных в памяти ... в Swift или на любом другом языке программирования. Зачем? Потому что это затрудняет работу менеджера памяти: это может привести к «утечке памяти» из-за циклических ссылок. Также: не делайте эти «справедливые структуры». Пусть они будут «объектами», которыми они, естественно, являются. –