如何使用Swift3 + Optional + NSOrderedSet + Generic来优雅地使用CoreData

时间:2017-08-23 13:35:13

标签: ios swift core-data swift3

当使用带有Swift和Xcode8的Core Data时,我会在下面生成一个模型,但我觉得它很难使用:

  1. chapter与另一个模型的关系,并且其类型已生成为NSOrderedSet
  2. 我实际上不能将NSOrderedSetNSOrderedSet<Chapter>?
  3. 一起使用
  4. 我必须使用生成的访问器修改集合,这很烦人
  5. Core Data生成的所有属性都是可选的,模型嵌套深,我必须使用很多后卫或?解压缩可选值
  6. 我怀疑你们如何与Swift一起玩Core Data ......

    :(

    我应该尝试使用Realm吗?

    CourseDetail.swift

    extension CourseDetail {
        @NSManaged public var title: String?
        @NSManaged public var chapter: NSOrderedSet?
        @NSManaged public var author: NSOrderedSet?
    }
    
    // MARK: Generated accessors for chapter
    extension CourseDetail {
    
        @objc(addChapterObject:)
        @NSManaged public func addToChapter(_ value: Chapter)
    
        @objc(removeChapterObject:)
        @NSManaged public func removeFromChapter(_ value: Chapter)
    
        @objc(addChapter:)
        @NSManaged public func addToChapter(_ values: NSSet)
    
        @objc(removeChapter:)
        @NSManaged public func removeFromChapter(_ values: NSSet)
    
    }
    

1 个答案:

答案 0 :(得分:1)

在我的情况下,我不使用生成的类,我自己编写它们而不使用选项,除非需要。您不必使用生成的类。

即使生成的访问器也可以手写,它们遵循简单的键值编码命名约定。

如果我正在编写课程,它看起来像是:

@objc(CourseDetail)
public final class CourseDetail: NSManagedObject { // The actual class, no longer an extension.
    @NSManaged public var title: String
    @NSManaged public var chapter: NSSet
    @NSManaged public var author: NSSet

    // A convenience for fetch requests
    @nonobjc public class func fetchRequest() -> NSFetchRequest<CourseDetail> {
        return NSFetchRequest<CourseDetail>(entityName: "CourseDetail");
    }

    @objc(addChapterObject:)
    @NSManaged public func addToChapter(_ value: Chapter)

    @objc(removeChapterObject:)
    @NSManaged public func removeFromChapter(_ value: Chapter)

    @objc(addChapter:)
    @NSManaged public func addToChapter(_ values: NSSet)

    @objc(removeChapter:)
    @NSManaged public func removeFromChapter(_ values: NSSet)

}