存储的属性需要初始值或应该是@NSManaged

时间:2015-04-05 00:25:33

标签: ios swift core-data properties nsmanagedobject

我尝试转换Apple's sample code以创建Core Data的自定义部分标识符,以便正确地将表格视图中的部分从Objective-C排序/标记到Swift中。他们为声明为@dynamic的非瞬态属性实现了一个setter,这样他们就可以在时间变化时使标识符无效。我以为我会在didSet属性上使用@NSManaged,但Xcode会抛出错误:Stored property requires an initial value or should be @NSManaged

如何适当地转换以获得所需的行为?

@property (nonatomic) NSDate *primitiveTimeStamp;
@property (nonatomic) NSString *primitiveSectionIdentifier;

@dynamic title, timeStamp, primitiveTimeStamp, sectionIdentifier, primitiveSectionIdentifier;

- (void)setTimeStamp:(NSDate *)newDate {
    // If the time stamp changes, the section identifier become invalid.
    [self willChangeValueForKey:@"timeStamp"];
    [self setPrimitiveTimeStamp:newDate];
    [self didChangeValueForKey:@"timeStamp"];

    [self setPrimitiveSectionIdentifier:nil];
}

我试过了:

var primitiveTimeStamp: NSDate?
var primitiveSectionIdentifier: String?

@NSManaged var timeStamp: NSDate { //error here
    didSet {
        self.willChangeValueForKey("timeStamp")
        self.primitiveDate = timeStamp
        self.didChangeValueForKey("timeStamp")

        self.primitiveSectionIdentifier = nil
    }
}

我也试过取消@NSManaged并使用var timeStamp: NSDate!,然后将代码放在didSet中,这实际上对第一次启动效果很好 - 我可以创建一个对象和存储它并在表格的适当部分查看。但在后续发布时,timeStamp属性为nil,因此在尝试生成sectionIdentifier时应用会崩溃。

1 个答案:

答案 0 :(得分:1)

您定义的

timeStamp是存储的属性而不是计算属性。计算属性可能没有didSet / didGet观察者。

  

您不需要为非重写的计算属性定义属性观察器,因为您可以直接在计算属性的setter中观察并响应其值的更改。

var primitiveTimeStamp: NSDate?
var primitiveSectionIdentifier: String?

var timeStamp: NSDate {
  get {
    return self.primitiveDate
  }

  set {
    self.willChangeValueForKey("timeStamp")
    self.primitiveDate = newValue
    self.didChangeValueForKey("timeStamp")

    self.primitiveSectionIdentifier = nil
  }
}

由于计算属性应该只有一个getter,或者只有setter / getter,你还必须设置getter。

我没有测试代码,但他们可能会解决您的问题。

PS:如果要为计算属性设置属性观察器,可以对类进行子类化,并将属性观察器添加到继承的属性中。