Swift 2:可以使用 @NSManage 标记自动生成方法

猛戳链接查看最终版

原文链接 作者:Tomasz Szulc 原文日期:2015/08/06 译者:mmoaay;校对:numbbbbb;定稿:shanks

Xcode 7 beta 5 中的 Swift 2 拥有另外一个特性:当使用一对多关系时我们可以用 @NSManaged 来声明自动生成方法。

这个技巧非常有用。假设你有一个 Library 和多个 Book 实体对象。且 Library 和 books 是一对多的关系。那么使用最新的 Xcode 和 @NSManaged 就可以在 Library 实体对象内(手动)声明自动生成方法。

就像下面这样:

class Library: NSManagedObject {@NSManaged func addBooksObject(book: Book)@NSManaged func removeBooksObject(book: Book)@NSManaged func addBooks(books: Set<Book>)@NSManaged func removeBooks(books: Set<Book>)}

天哪,这种实现方式竟然如此优雅!就在几天前我还不得不从零开始写这些方法。

但我发现一个问题。我们确实可以像这样声明方法,但是问题的关键是如何在任意位置生成它们并放入到 Entity+CoreDataProperties.swift 文件中?生成 Objective-C 子类时这些方法都会继承,甚至在 Swift 项目中也是如此。然而,生成 Swift 语言时——这些方法竟然不见了!详情参见 rdar://22177139 。

下面的代码是 Objective-C 生成的实体类

@interface Library (CoreDataGeneratedAccessors)- (void)addBooksObject:(Book *)value;- (void)removeBooksObject:(Book *)value;- (void)addBooks:(NSSet<Book *> *)values;- (void)removeBooks:(NSSet<Book *> *)values;@end

如果你将关系标记为有序,,就需要手动声明更多方法

– (void)insertObject:(Book *)value inBooksAtIndex:(NSUInteger)idx;- (void)removeObjectFromBooksAtIndex:(NSUInteger)idx;- (void)insertBooks:(NSArray<Book *> *)value atIndexes:(NSIndexSet *)indexes;- (void)removeBooksAtIndexes:(NSIndexSet *)indexes;- (void)replaceObjectInBooksAtIndex:(NSUInteger)idx withObject:(Book *)value;- (void)replaceBooksAtIndexes:(NSIndexSet *)indexes withBooks:(NSArray<Book *> *)values;- (void)addBooksObject:(Book *)value;- (void)removeBooksObject:(Book *)value;- (void)addBooks:(NSOrderedSet<Book *> *)values;- (void)removeBooks:(NSOrderedSet<Book *> *)values;

这样写好麻烦啊……希望他们尽快修复这个问题 🙂

另一个等待 Apple 修复的问题是:有序的一对多关系及其自动生成的方法。这个问题存在已久。但不知道是否有对应的错误报告。我认为这个问题发生在 Core Data 和下面这个方法第一次被释放时。假设我们想给 Library 添加一些 Book

let ctx = self.managedObjectContextlet library = NSEntityDescription.insertNewObjectForEntityForName(“Library”, inManagedObjectContext: ctx) as! Librarylet book1 = NSEntityDescription.insertNewObjectForEntityForName(“Book”, inManagedObjectContext: ctx) as! Booklibrary.addBooksObject(book1)

结果是根本运行不起来。

, reason: ‘*** -[NSSet intersectsSet:]: set argument is not an NSSet’*** First throw call stack:(CoreFoundationFoundationCoreDataNewNSManagedExampleUIKitUIKitUIKitFrontBoardServicesFrontBoardServicesCoreFoundationCoreFoundationCoreFoundationUIKitlibdyld.dylib0x039afa21 start + 1)libc++abi.dylib: terminating

这个问题唯一的解决办法就是重新实现那些方法。 详情参见rdar://22177512——希望他们早日修复这个问题。

旅行,有一种苍凉,“浮云游子意,落日故人情”,

Swift 2:可以使用 @NSManage 标记自动生成方法

相关文章:

你感兴趣的文章:

标签云: