如何指向尚未实例化的对象

时间:2014-10-22 05:13:05

标签: core-data swift instantiation

我正在预装应用程序首次启动到Core Data的数据,需要指向尚未实例化的对象,并且无法弄清楚如何执行此操作。我看到了类似的问题,但解决方案并不适用于这种情况。

说我有3个班级

class Person {
  var nationOfBirth: Nation
  ...
}

class City {
  var mayor: Person
  ...
}

class Nation {
  var capitalCity: City
  ...
}

如果我正在加载一个国家的初始数据集,然后是城市,那么人(或任何其他顺序)那么无论我加载它们的哪个顺序,我都需要设置尚未实例化的实例(尽管我知道他们会是)我正在努力弄清楚如何做到这一点,并将感谢任何帮助

1 个答案:

答案 0 :(得分:0)

其中一个字段必须是可选字段,因为在您的示例中,您有循环引用。此外,在这种情况下,可选字段必须具有另一个字段的周参考,以便最终正确地清除内存。你的代码:

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方法中初始化。

要初始化你需要国家对象的人,要初始化国家你需要城市的对象,初始化需要国家对象的城市,并且再次需要人的对象,比市,比国家。如你所见,它是无限循环。

要解决此问题,您需要打破此循环。您只能将One类的设置字段设置为可选(在类型的末尾使用?)。之后,您不需要在初始化程序中初始化该字段,因为现在它可以包含nil(无)。

如果您不需要在初始化程序中初始化它,您现在可以使用可选字段创建类的成员而不使用另一个类的对象,并将其设置为最终。在我的代码中,您可以看到,Nation中的City字段被设置为可选,因此我可以创建Nation的成员而没有初始City值(let nation = Nation())。

之后,因为我有班级国家的成员,我可以创建具有Nation对象的初始化者(让人=人(国家:国家))。

与现在一样,我们创建了人员,我们可以创建城市成员(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