我正在将使用Swift
编写的项目转换为使用CoreData
。一切正常,但现在我正在尝试将自定义类转换为NSManagedObject
类,以便在CoreData
中存储它的属性。它看起来像这样:
import UIKit
import CoreData
class Jar: NSManagedObject {
@NSManaged var name: String
@NSManaged var jarDescription: String
@NSManaged var jarType: UIImage
@NSManaged var progress: Int
@NSManaged var jarSize: Int
/*
init() {
name = "Some Jar"
jarType = UIImage(named: "EmptyJar3.png")
progress = 0
jarSize = 60
jarDescription = ""
*/
}
我已对init()
进行了评论,因为根据我的阅读,您无法在NSManagedObject
上使用初始化方法。但是我的项目中的其他地方的代码实例化了Jar
类型的对象,对于没有为此类显式设置的属性,我希望为这些属性设置某种默认的初始值。
有没有办法在class Jar: NSManagedObject
内执行此操作?如果我正在编写检查方法以查看是否已设置属性,然后在实例化新CoreData
对象的任何地方将其明确保存到Jar
,那么它似乎会变得非常混乱。
答案 0 :(得分:1)
如果您从Objective-C移植应用程序,那么为什么不只是执行您的ObjC代码所做的事情(显然,它没有实现-init)。
可以提供您自己的自定义初始化方法,但您必须确保正确调用initWithEntity:insertIntoManagedObjectContext:
,并且最好仔细阅读文档。
您可以覆盖awakeFromInsert
和/或awakeFromFetch
,但您应该了解这样做所涉及的一些特质。
我发现,一般来说,如果你想要进行特殊的初始化,那么你最好不要编写工厂方法。我确信你可以用swift中的“类方法”做同样的事情,但是我还没有理由写任何swift,所以我不知道swift,所以我将在ObjC中给出例子,你可以解释其余部分。
例如......
+ (NSString*)entityName
{
return @"Jar";
}
+ (instancetype)jarWithName:(NSString*)name
imageName:(NSString*)imageName
size:(NSUInteger)size
inManagedObjectContext:(NSManagedObjectContext*)context
{
Jar *jar = [NSEntityDescription
insertNewObjectForEntityForName:[self entityName]
inManagedObjectContext:context];
jar.name = name;
jar.jarDescription = @"";
jar.jarType = [UIImage imageNamed:imageName];
jar.progress = 0;
jar.jarSize = size;
return jar;
}
+ (instancetype)jarInManagedObjectContext:(NSManagedObjectContext*)context
{
return [self jarWithName:@"Some Jar"
imageName:@"EmptyJar3.png"
size:60
inManagedObjectContext:context];
}
答案 1 :(得分:0)
您可以覆盖NSManagedObject的awakeFromInsert
方法以填充默认值。请参阅Apple文档here