Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使我的简单对象符合Swift中的NSManagedObject和NSCoding_Ios_Core Data_Nsmanagedobject_Nscoding - Fatal编程技术网

Ios 如何使我的简单对象符合Swift中的NSManagedObject和NSCoding

Ios 如何使我的简单对象符合Swift中的NSManagedObject和NSCoding,ios,core-data,nsmanagedobject,nscoding,Ios,Core Data,Nsmanagedobject,Nscoding,我用swift将两个对象存储在核心数据中。列表是一个对象,项是另一个对象 下面是列表类: import Foundation import CoreData class List:NSManagedObject { /* Remember, any @NSMananged variables added or changed here needs to be reflected in Model */ @NSManaged var name:String @

我用swift将两个对象存储在核心数据中。列表是一个对象,项是另一个对象

下面是列表类:

import Foundation
import CoreData

class List:NSManagedObject {
    /* Remember, any @NSMananged variables added or changed here 
     needs to be reflected in Model */
    @NSManaged var name:String
    @NSManaged var items: [Item]
}
下面是我对Item类的处理:

    import Foundation
import CoreData

class Item:NSManagedObject, NSCoding {
    /* Remember, any @NSMananged variables added or changed here
     needs to be reflected in Model */
    @NSManaged var title:String
    @NSManaged var address:String
    @NSManaged var notes:String
    @NSManaged var quantity:Int32

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(title, forKey: "title")
        aCoder.encodeObject(address, forKey: "add")
        aCoder.encodeObject(notes, forKey: "notes")
        aCoder.encodeInt32(quantity, forKey: "qty")
    }

    override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) {

    }

    required init(coder aDecoder: NSCoder) {
        title = aDecoder.decodeObjectForKey("title") as! String
        address = aDecoder.decodeObjectForKey("add") as! String
        notes = aDecoder.decodeObjectForKey("notes") as! String
        quantity = aDecoder.decodeInt32ForKey("qty") 
    }
}
我已经阅读了有关NSManagedObject、NSObject和NSCoding的苹果文档,它也可能是用外国语言编写的

如果我没有实现任何功能,它就不符合NSCoding。如果我实现encodeWithCoder()和required init(),它符合NSCoding,但它希望我添加另一个init(实体…),以符合NSManagedObject。我不知道该怎么处理这件事


谢谢你的帮助。这真让我头疼。如果你需要更多的信息,我会根据需要编辑这篇文章

您不需要遵守
NSCoding
。核心数据将存储您在模型中定义的所有属性,而无需
NSCoding
,并且您不需要实现任何东西来将内容放入数组中

但是


如果您已将核心数据中的属性设置为“可转换”,那么这就解释了您的目的地,您需要实现
NSCoding
,但它不能同时是托管对象。这也是错误的方法,因为您应该在模型中使用关系。

您不需要遵守
NSCoding
。核心数据将存储您在模型中定义的所有属性,而无需
NSCoding
,并且您不需要实现任何东西来将内容放入数组中

但是


如果您已将核心数据中的属性设置为“可转换”,那么这就解释了您的目的地,您需要实现
NSCoding
,但它不能同时是托管对象。这也是错误的方法,因为您应该在模型中使用关系。

清理混乱的最简单方法:

  • 删除这两个子类
  • 在核心数据模型中,设置从
    列表
    项目
    (一对多)的关系以及从
    项目
    列表
    的反向关系
  • 重新创建
    NSManagedObject
    子类
就这样。现在,核心数据将为您管理一切。不需要
NSCoding

编辑:

获取
列表
对象的有序
数组,例如按
数量排序

let items = (list.items.allObjects as! [Item]).sort{ $0.quantity < $1.quantity }
let items=(list.items.allObjects as![Item])。排序{$0.quantity<$1.quantity}

清理混乱的最简单方法:

  • 删除这两个子类
  • 在核心数据模型中,设置从
    列表
    项目
    (一对多)的关系以及从
    项目
    列表
    的反向关系
  • 重新创建
    NSManagedObject
    子类
就这样。现在,核心数据将为您管理一切。不需要
NSCoding

编辑:

获取
列表
对象的有序
数组,例如按
数量排序

let items = (list.items.allObjects as! [Item]).sort{ $0.quantity < $1.quantity }
let items=(list.items.allObjects as![Item])。排序{$0.quantity<$1.quantity}


为什么要使它符合
NSCoding
?@Wain我觉得它必须符合NSCoding,这样我才能将它存储在List类的items:[Item]中。这是错的吗?是的,这是错的。如果您设置了核心数据模型,使列表与项具有多对一的关系,那么所有这些都将由您自行处理。为什么您要使其符合
NSCoding
?@Wain I认为它必须符合NSCoding,以便我可以将其存储在列表类的items:[item]中。这是错的吗?是的,这是错的。如果您设置了您的核心数据模型,使列表与项目具有多对一的关系,那么YouTunks Wain将处理好所有这些。所以不要把它放在模型中作为可转换的(这就是我所做的)。如果它不可转换,我应该将数组类型设置为什么?String?删除属性并创建一个双向关系,然后重新生成模型类-对于那些不能成为/没有意义成为实体的东西,可以使用可转换属性。这种关系将在代码中显示为一组。现在我真的迷路了。然后我是删除类列表中的属性还是将其保留在那里?如果我删除了它,那么我如何将一个项目与一个特定的列表相关联?谢谢Wain。所以不要把它放在模型中作为可转换的(这就是我所做的)。如果它不可转换,我应该将数组类型设置为什么?String?删除属性并创建一个双向关系,然后重新生成模型类-对于那些不能成为/没有意义成为实体的东西,可以使用可转换属性。这种关系将在代码中显示为一组。现在我真的迷路了。然后我是删除类列表中的属性还是将其保留在那里?如果我将其删除,那么如何将项目与特定列表关联?谢谢您的输入。现在我有一个NSSet,据我所知是无序的。如何使用它填充tableviewcells,以及当选择/删除一个时,如何确保它是正确的。您可以使用特定的排序描述符执行提取,也可以使用
(list.items.allObjects as![Item])。排序{$0.quantity<$1.quantity}
,它返回一个数组并按
数量对项目进行排序。我编辑了答案。谢谢。我知道这是怎么回事。我正在修复所有现在已损坏的代码,以处理新数组。谢谢你的帮助,谢谢你的意见。现在我有一个NSSet,据我所知是无序的。如何使用它填充tableviewcells,以及在选择/删除其中一个时,如何确保它是正确的