У меня есть отношения, которые можно описать таким образом;
У одного
Parent
многоChild
(детей)
struct Parent {
var name: String
var cost: Int
var productionCost: Int
var income: Int
var children: [Child] = [Child]()
init(name: String) {
self.name = name
}
}
struct Child {
var name: String
var parent: Parent?
var owner: Player?
}
// not used but the intention is to so a player can own a child
class Player {
var name:
var cards: [Child] = [Child]()
}
Родитель должен знать, какие дочерние элементы у него есть, и точно так же дочерний элемент должен знать, какому родителю он принадлежит.
Но на игровых площадках Swift я заметил потенциальную циклическую ссылку.
If I do;
var parent = Parent.init(name: "Parent #1")
var child = Child.init(name: "Child #1", parent: parent)
parent.children.append(child)
print (parent)
Свифт сообщает игровая площадка;
Отладка показывает родителей-детей, которые, в свою очередь, показывают родителя и т. д.
Я понимаю, что циклические ссылки не являются плохими по наследству, но я хотел бы попытаться избежать их в описанных отношениях.
Мне нужен только первый родитель.
По другим подобным вопросам в StackOverflow я прочитал следующее:
«ваши дочерние объекты должны быть тупыми объектами данных, они ничего не знают о своих родителях и являются автономными»
"родитель просто содержит дочерние объекты, он не внедряется в них"
Но я не уверен, как это поможет, поскольку мне нужно знать, какому родителю принадлежит ребенок.
Мой вопрос;
Как я могу избежать циклической ссылки в структурах, когда мне нужно присвоить отношения обеим сторонам?
struct
являются типами значений. Таким образом, ваша попытка сделать так, чтобы дочерний элемент имел ссылку на родителя, не совсем имеет смысла, потому что вы действительно создаете копию родителя. Такая двусторонняя связь имеет смысл только со ссылочными типами. - person Rob   schedule 18.05.2017class
. И как только вы введете эталонную семантику в свою модель, я, вероятно, создам оба класса (хотя теоретически дочерним элементом может бытьstruct
). Но я бы сделал шаг назад и спросил себя, действительно ли вам нужно, чтобы дочерний элемент сохранял ссылку на своего родителя. Иногда вам это не нужно, и вы можете не жертвовать преимуществами семантики значений, если вам не нужно. Например, вам действительно нужно знать, в какой колоде находится карта? Или, имея дело с данной картой, вы всегда уже знаете, какую колоду используете? - person Rob   schedule 18.05.2017Factory -< Engines Engine >-Player
Игрок держит карту (двигатель), но эта карта нуждается в ссылке на фабрику (родителя), чтобы мы могли выполнитьone to many through
; поэтому кажется, что ссылки - это то, что мне нужно. - person zardon   schedule 18.05.2017