如何在Swift中初始化生成的Core Data NSManagedObject

时间:2015-03-26 16:03:36

标签: ios swift core-data

我知道obj-​​c但我学得很快。

在obj-c中使用核心数据时,您可以对数据建模并告诉xcode生成模型的nsmanageobject子类。 然后在代码中将其初始化为

#import MyObject
- (void) someMethod
{
    MyObject *my = (Card *) [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:[self managedObjectContext]];

    my.name = @"some name";
}

在swift中,我试图做同样的事情,但我似乎无法弄清楚如何初始化我的自定义对象。 这就是我所拥有的:

生成的NSManagedObject子类:

导入基金会     导入CoreData

class Card: NSManagedObject
{
    @NSManaged var card_name: String
    @NSManaged var card_id: String
    @NSManaged var card_issuer: String
    @NSManaged var card_type: String
}

然后我试图在另一个类上使用它,如下所示:

var card : Card
card.card_name = "Some Name"
card.card_issuer = "HOA"
card.card_type = "Rec Center"
card.card_id =  "123"

但我得到的错误是:

  

变量'卡'在初始化之前使用

我显然错过了一步,但我无法指出它是什么。

另外,正如几位iOS教师所提到的那样,你不应该混淆生成的NSManagedObject子类。

有什么建议吗?

修改 我现在得到一个错误:(应该是一个新的SO问题......)

  

CoreData:警告:无法加载名为' Card'实体'卡'。找不到类,而是使用默认的NSManagedObject。

以下屏幕截图显示了此类在构建阶段中是如何存在的,并且实体名称已在xcdatamodeld文件中设置 enter image description here

enter image description here 感谢

2 个答案:

答案 0 :(得分:8)

你有这个:

var card : Card

声明card的类型为Card但不创建实例。您需要在使用之前分配和初始化实例。这里的初始化规则与Objective-C中的相同,即您必须在对象上调用指定的初始化程序。你可以这样做:

var card = NSEntityDescription.insertNewObjectForEntityForName("Card", inManagedObjectContext: self.managedObjectContext) as! Card

对于它的价值,您的Objective-C代码段不正确,因为init不是NSManagedObject的指定初始值设定项。

答案 1 :(得分:1)

您声明变量card但从未初始化它。

您需要核心数据上下文,然后您可以创建一个实例:

let entity = NSEntityDescription.entityForName("Card", inManagedObjectContext: managedObjectContext)
let card = Card(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)

在上下文中设置一个空的Card实例。保存上下文后,您的新卡将存放在商店中。