Одно из этих полей должно быть необязательным, поскольку в вашем примере у вас есть ссылки на цикл. Кроме того, поле «Дополнительно» в этом случае должно иметь ссылку на неделю для другого поля для правильной очистки памяти в конце. Код:
class Person {
var nationOfBirth: Nation
init(nation: Nation) {
nationOfBirth = nation
}
}
class City {
var mayor: Person
init(person: Person) {
mayor = person
}
}
class Nation {
weak var capitalCity: City?
}
//initialization
let nation = Nation()
let person = Person(nation: nation)
let city = City(person: person)
nation.capitalCity = city
В быстро, если вы объявляете поле в классе без по умолчанию инициализации вы должны инициализировать его в конструкторе (INIT). В вашем случае у вас есть 3 класса, каждый из которых имеет одно поле другого класса без инициализации по умолчанию. Поэтому вам нужно инициализировать метод init.
Для инициализации лица вам нужен объект Нации, для инициализации Нации вам нужен объект города, для инициализации города вам нужен объект Нации, и вам снова нужен объект Личности, чем Город, чем Нация. Как вы видите, это бесконечная петля.
Для решения этой проблемы необходимо разбить этот цикл. Вы можете сделать это только с полем установки одного класса как необязательным (с? В конце типа). После этого вам не нужно инициализировать это поле в инициализаторе, потому что теперь он может содержать nil (ничего).
Если вам не нужно инициализировать его в инициализаторе, теперь вы можете создать член класса с необязательным полем без объекта другого класса и просто установить его в конце. В моем коде вы можете видеть, что поле «Город» в Nation задано как необязательное, поэтому я могу создать член Nation без начального значения City (let nation = Nation()
).
После этого, поскольку у меня есть член класса Nation, я могу создать Person с инициализатором, который берет объект Nation (let person = Person (нация: нация)).
Таким же образом, как и теперь, мы создали человека, которого мы можем создать участник города (let city = City(person: person)
).
В конце концов, у нас есть член города, поэтому мы можем установить его на объект нации, который был создан в начале без города (nation.capitalCity = city
).
О том, почему мы должны слабой ссылке в этом случае вы можете прочитать слышащий - https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-XID_92
Посмотрите в Свифте опции – Ian