【问题标题】:How to point to objects that aren't yet instantiated如何指向尚未实例化的对象
【发布时间】:2014-10-22 05:13:05
【问题描述】:

我正在将应用程序首次启动时的数据预加载到 Core Data 中,需要指向尚未实例化的对象,但不知道如何执行此操作。我看到了一个类似的问题,尽管该解决方案不适用于这种情况。

假设我有 3 节课

class Person {
  var nationOfBirth: Nation
  ...
}

class City {
  var mayor: Person
  ...
}

class Nation {
  var capitalCity: City
  ...
}

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

【问题讨论】:

  • 在 swift 中查看选项

标签: core-data swift instantiation


【解决方案1】:

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

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

要初始化 Person 你需要 Nation 的对象,要初始化 Nation 你需要 City 的对象,要初始化 City 你需要 Nation 的对象,同样你需要 Person 的对象,而不是 City,而不是 Nation。如您所见,它是无限循环。

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

如果您不需要在初始化程序中对其进行初始化,您现在可以创建具有可选字段的类成员,而无需另一个类的对象,然后将其设置在最后。在我的代码中,您可以看到,Nation 中的 City 字段设置为可选,因此我可以在没有初始 City 值(let nation = Nation())的情况下创建 Nation 成员。

之后,由于我是 Nation 类的成员,我可以使用带有 Nation 对象的初始化程序创建 Person(let person = Person(nation:nation))。

与现在我们创建个人成员的方式相同,我们可以创建城市成员(let city = City(person: person))。

最后我们有了 city 的成员,所以我们可以将它设置为国家对象,它是在开始时创建的,没有 city(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

【讨论】:

  • 首都应该是unowned而不是weak
  • @Abizern 在任何情况下,引用之一都必须是可选的,因为如果不是,您必须在初始化程序中对其进行初始化。在这种情况下,如果我将 capitalCity 设置为 unowned,那么我必须将 Person 类中的 countryOfBirth 设置为可选类型,否则我将无法初始化它,因为那时不会创建国家对象。所以我可以说 capitalCity 是可选的,弱的,或者是无主的,nationalOfBirth 是可选的。
  • 我看到的唯一问题(除非我读错了)是填充我在 JSON 列表中循环的数据,其中包括国家、城市,然后是创建实体的人(以及更多类似的类)读入属性数据后,尽管我需要每个具有相同nationOfBirth 的人都指向同一个 Nation 实例,因为类中的属性(例如 currentPresident 指向尚未实例化的 Person 实例)将改变并且需要可访问。该解决方案的变体是否可以在这种情况下工作(没有多个数据循环)
  • 感谢 Vasyl,这确实有帮助,但我不确定我是否准确地解释了我正在努力做好的事情,所以只需要要求一些额外的说明。使用上面的内容,我会读入,比如说一个 Nations.json 文件中 52 行的 52 个国家,这可以很好地与您的解决方案配合使用。然后我会在 people.json 中读取需要对我现在实例化的国家的引用。我现在实例化了国家和人民,但在我解析 city.json 之前没有城市。在这种情况下,所有类引用是否都需要是可选的(例如,如果 Person 也有 cityOfBirth)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多