我正在尝试向Card
张卡添加新的Deck
,但在尝试将卡片保存到卡片cards
时遇到了问题。如何将其转换为NSSet
?
func saveQA(question: String, answer: String) {
let currentDeckName = deckName
let entity = NSEntityDescription.entityForName("Card", inManagedObjectContext: managedContext)
let newQA = Card(entity: entity!, insertIntoManagedObjectContext: managedContext)
newQA.question = question
newQA.answer = answer
currentDeckName!.cards = newQA
do {
try managedContext.save()
userCards.append(newQA)
}
catch {
let saveError = error as NSError
print(saveError)
}
}
答案 0 :(得分:1)
在此,您尝试将Card
分配给期望NSSet
的媒体资源。卡不是一组(虽然它可能是一组中的对象)。
currentDeckName!.cards = newQA
利用类型安全
由于您使用Swift编写代码,因此首先应该使用Swift类型,例如Set
而不是NSSet
。在Deck+CoreDataProperties.swift
中,将您的关系从NSSet?
更改为打印的一组卡片。
@NSManaged var cards: Set<Card>
这不仅告诉Swift cards
是一个Set,还指定集合中的对象为Card
s。
您总是希望声明关系的特定类型,以便从语言的类型安全性中受益。这允许编译器阻止您向卡组的卡片添加除Card
之外的任何内容。
将卡片添加到卡座
您可以使用常规Set
方法(例如insert
)将卡片插入卡片组。
currentDeckName.cards.insert(newQA)
然而,更容易的方法是在卡本身上使用反向关系。换句话说,告诉新卡它属于这个套牌:
newQA.deck = currentDeckName
这会自动将卡片添加到套牌的卡片中。
代码少一些,阅读和理解通常会更少。
说到可读性,您可能需要考虑将currentDeckName
重命名为currentDeck
,因为该对象是Deck
,而不是套牌的名称。
答案 1 :(得分:0)