Настройка
Предположим, у меня есть два класса:
final class Parent: NSObject
{
var child: Child
}
final class Child: NSObject
{
weak var parent: Parent?
init(parent: Parent)
{
self.parent = parent
}
}
Вопрос:
Теперь предположим, что я хочу создать экземпляр child
и установить sh это соотношение в init()
методе Parent
. Я бы сделал это:
final class Parent: NSObject
{
var child: Child
init()
{
child = Child.init(parent: self) // ERROR!
}
}
Свифт, который я использую self
до super.init()
. Если я ставлю super.init()
до того, как создаю экземпляр child
, Свифт скулит, что child
не присвоено значение при вызове super.init()
.
Я закрывал Swift, используя неявно развернутые опции, например:
final class Parent: NSObject
{
var child: Child!
init()
{
super.init()
child.init(parent: self)
}
}
Мой вопрос: что люди делают в этой ситуации? Это / был ОЧЕНЬ распространенный паттерн в Objective- C, и Swift не производит ничего, кроме головной боли. Я понимаю, что могу отменить присвоение parent
от Child
s init()
, чтобы я мог init()
child, позвонить super.init()
, а затем назначить parent
, но это не вариант в реальных случаях, когда я сталкиваюсь с этим. Это также уродливо и раздуто.
Я понимаю, что цель Свифта - предотвратить использование объекта до его полной инициализации. И что для child
init()
возможно перезвонить на parent
и состояние доступа, которое еще не настроено, что становится опасностью при неявно развернутом необязательном подходе.
I Здесь я не могу найти никаких советов о наилучшей практике Swift, поэтому я спрашиваю, как люди решают эту проблему с яйцом и курицей. Действительно ли превращение свойств в неявно развернутые необязательные параметры - лучший способ обойти это ограничение? Спасибо.