ios - 如何将我的 Card 转换为 NSSet?

标签 ios swift uitableview core-data

我正在尝试将新的 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/

相关文章:

iOS:出现键盘时调整屏幕大小(在 HTML5 APP 中)

ios - 如何创建 UITableView 加载数据样式,如 Facebook App 样式?

ios - iOS 6 MapKit 是否适用于早期版本的 iOS?

ios - 我的应用程序没有出现在 iOS6 的位置设置列表中

ios - 如何在 Swift 的 UITableView 中检测单元格选择?

arrays - 使用迭代器而不是 Swift 中的位置访问数组的元素

ios - 从继承类访问父类(super class)属性

ios - 从远程数据库填充 UITableView 单元格

ios - 使用 TableView 进行 NSData 卸载

ios - 在文本字段之间拖动文本,如 ios 5 的邮件应用程序