Swift 为什么我不能将结构数组保存到coredata中?

Swift 为什么我不能将结构数组保存到coredata中?,swift,core-data,Swift,Core Data,我正在尝试将结构数组保存到coredata中 class Model: NSManagedObject { @NSManaged var decks:[astruct] //Error here } 结构呢 struct astruct { let card:Card var status:Bool } enum Card:Int { .. } 错误状态:无法将属性标记为@NSMAnaged,因为它的类型无法在obj-c中表示,因为许多关系都是根据您在托管对象模型中配置关系

我正在尝试将结构数组保存到coredata中

class Model: NSManagedObject
{

 @NSManaged var decks:[astruct]  //Error here
}
结构呢

struct astruct
{
let card:Card
var status:Bool
}


enum Card:Int
{
    ..
}

错误状态:无法将属性标记为@NSMAnaged,因为它的类型无法在obj-c中表示,因为许多关系都是根据您在托管对象模型中配置关系的方式键入到
NSSet
NSOrderedSet
的。这些集合或有序集合中包含的任何类型的对象也必须是
NSManagedObject
的子类,并与托管对象模型中配置的关系相匹配

我喜欢为
NSSet
sensorderedset
创建一些通用函数,这些函数可以轻松地将它们映射到任意值的数组

extension NSSet {
    func array<T>() -> [T] {
        var output = [T]()
        for obj in self.allObjects {
            if let t = obj as? T {
                output.append( t )
            }
        }
        return output
    }
}

extension NSOrderedSet {
    func array<T>() -> [T] {
        var output = [T]()
        for obj in self.array {
            if let t = obj as? T {
                output.append( t )
            }
        }
        return output
    }
}

高层的CoreData只是轻量级关系数据库的包装器。与所有关系数据库一样,可以存储的数据类型有限。从xcdatamodeld文件中,您可以在Xcode中选择它,下面是一个示例实体,其示例属性具有受支持的类型:

在屏幕截图中,您可以看到,与其他关系数据库一样,CoreData中没有数组数据类型。您应该像处理其他关系数据库一样处理CoreData。如果应用程序中有需要存储/检索的复杂数据结构,则需要计划如何分解应用程序数据结构并将其转换为兼容的关系数据库实体/属性。解决方案有多种方法,但我首先要将数组视为数据库中的实体/表,并将数组元素视为该实体/表中的行。CoreData实体应该有一个
card
属性作为整数类型之一映射回
astruct.card
enum属性,还有一个
status
属性作为布尔值映射回
astruct.status
属性


注意:如果采用这种方法,CoreData布尔类型与ObjC布尔类型不兼容。CoreData将布尔类型作为NSNumber来使用,因此@NSManaged属性需要是NSNumber,而不是Swift的布尔类型。

像这样的变量组:[astruct]!删除“@NSManaged”Deck是一个结构。卡片是一个枚举
// Model declarations
@objc class Model: NSManagedObject {
    @NSManaged var decks: NSOrderedSet
}

@objc class Deck: NSManagedObject {
    @NSManaged var status: NSNumber // For bool
    @NSManaged var cards: NSOrderedSet
}

@objc class Card: NSManagedObject {}

// Sample usage
if let model = loadModel() {
    let decks: [Deck] = model.decks.array()
    for deck in decks {
        let cards: [Card] = deck.cards.array()
    }
}