У меня есть два объяснения, почему вы получаете ноль:
- Управляемые объекты работают не очень хорошо, пока они не вставлены.
- Ваш
foo
являетсячто я бы назвал постоянным хранимым свойством .Я придумал имя, потому что, красный флаг, я не могу найти никаких примеров этого в главе книги Swift по Свойства
Соедините эти два ивы получаете крайний случай, который не работает.
При этом я немного удивлен, что ваш параметр foo
не работает, потому что foo
не является управляемым свойством (то естьэто не в модели данных).Если я сделаю такое постоянное хранимое свойство в обычном неуправляемом объекте…
public class Animal {
public let foo: String! = "Foo"
}
, оно будет считано позже, как и ожидалось.
Итак, если вы можетедопустим, что этот крайний случай просто не работает в Core Data, вы можете перейти к нескольким более обычным способам работы.
Один из способов - объявить foo
как var
и присвоить значение в awakeFromInsert()
, которое, как я упоминал ранее, после вставки.В Core Data awakeFromInsert()
является одним из ваших друзей ...
@objc(Person)
public class Person: Address {
public var foo: String!
override public func awakeFromInsert() {
foo = "Foo"
}
}
Еще один способ, который работает, это вычисляемое свойство ...
@objc(Person)
public class Person: Address {
public var foo : String { return "Foo" }
}
И, наконец, самый логичный способ,Так как foo является константой для всех экземпляров, нужно сделать ее свойством типа …
@objc(Person)
public class Person: Address {
static var foo: String = "Foo"
}
, но, конечно, если вы делаете это, вы должны ссылаться на него как Person.foo
вместо person.foo
.