2014-10-22 4 views
0

Я предварительно загружаю данные о первом запуске приложения в Core Data, необходимо указать объекты, которые еще не созданы, и не могут понять, как это сделать. Я видел подобный вопрос, хотя решение не применимо в этой ситуации.Как указать объекты, которые еще не созданы.

Скажем, у меня есть 3 класса

class Person { 
    var nationOfBirth: Nation 
    ... 
} 

class City { 
    var mayor: Person 
    ... 
} 

class Nation { 
    var capitalCity: City 
    ... 
} 

Если я загрузке исходных данных, установленных наций, затем города, то люди (или любом другом порядке), то независимо от того, в каком порядке я загружаю их мне потребуется чтобы установить экземпляры еще не созданных экземпляров (хотя я знаю, что они будут), и я изо всех сил пытаюсь понять, как это сделать, и будет признателен за любую помощь.

+0

Посмотрите в Свифте опции – Ian

ответ

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.

Для инициализации лица вам нужен объект Нации, для инициализации Нации вам нужен объект города, для инициализации города вам нужен объект Нации, и вам снова нужен объект Личности, чем Город, чем Нация. Как вы видите, это бесконечная петля.

Для решения этой проблемы необходимо разбить этот цикл. Вы можете сделать это только с полем установки одного класса как необязательным (с? В конце типа). После этого вам не нужно инициализировать это поле в инициализаторе, потому что теперь он может содержать 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

+0

capitalCity, вероятно, следует 'unowned' вместо' weak' – Abizern

+0

@Abizern в любом случае, если один из ссылка должна быть необязательной, потому что, если это не так, вы должны инициализировать ее в инициализаторе. В этом случае, если я установил значение capitalCity в unowned, тогда я должен установить nationalOfBirth в классе Person как необязательный тип, иначе я просто не смогу его инициализировать, потому что объект страны не будет создан в то время. Поэтому я могу сказать, что capitalCity является факультативным и слабым или не имеет права, а nationalOfBirth не является обязательным. –

+0

Единственная проблема, с которой я вижу (если не ошибаюсь) - заполнять данные, которые я просматриваю через список стран JSON, затем города, а затем люди (и более похожие классы), создающие сущности с данными атрибутов, хотя мне нужно, чтобы каждый человек с одним и тем же народом должен был указать один и тот же экземпляр Nation в качестве атрибутов внутри класса (текущий пример, который указывает на экземпляр Person, который еще не будет создан) изменится и будет доступным. Будет ли вариант этого решения работать в этом сценарии (без нескольких циклов по данным) – littleblue

Смежные вопросы