我尝试转换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
时应用会崩溃。
答案 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:如果要为计算属性设置属性观察器,可以对类进行子类化,并将属性观察器添加到继承的属性中。