我正在尝试将新的 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)
}
}
最佳答案
在这里,您尝试将 Card
分配给需要 NSSet
的属性。卡片不是集合(尽管它可以是集合中的一个对象)。
currentDeckName!.cards = newQA
利用类型安全
由于您使用 Swift 编写代码,因此您应该做的第一件事就是使用 Swift 类型,例如 Set
而不是 NSSet
。在您的 Deck+CoreDataProperties.swift
中,将您的关系从 NSSet?
更改为一组类型化的卡片。
@NSManaged var cards: Set<Card>
这不仅告诉 Swift cards
是一个 Set,而且指定集合中的对象将是 Card
。
您总是希望为关系声明特定类型以从语言的类型安全中获益。这允许编译器阻止您将 Card
以外的任何内容添加到套牌的卡片组中。
将卡片添加到卡片组
您可以使用常用的 Set
方法,例如 insert
将卡片插入牌组中。
currentDeckName.cards.insert(newQA)
但是,更简单的方法是在卡片本身上使用反向关系。换句话说,告诉新卡它属于这个牌组:
newQA.deck = currentDeckName
这会自动将卡片添加到牌组的卡片组中。
它的代码有点少,而且通常越少越好阅读和理解。
说到可读性,您可能需要考虑将 currentDeckName
重命名为 currentDeck
,因为该对象是一个 Deck
,而不是牌组的名称.
关于ios - 如何将我的 Card 转换为 NSSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35122816/