我跟随Tim Roadley关于Core Data的书籍教程。我试图在swift中做一个迁移管理器,但是我收到了这个错误:额外的争论' forStoreMetadata'在电话中。 这是因为这个方法定义如下:
NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject],
forStoreMetadata: [NSObject : AnyObject])
我认为这是错误的,因为它缺少捆绑包上的选项,如此定义:
NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject]?)
我该如何解决这个问题?我想做的是:
var sourceModel = NSManagedObjectModel.mergedModelFromBundles(nil, forStoreMetadata: sourceMetadata)
答案 0 :(得分:0)
两个类方法定义如下(按住NSManagedObjectModel
按住Command键并跳转到其标题):
class func mergedModelFromBundles(bundles: [AnyObject], forStoreMetadata metadata: [NSObject : AnyObject]) -> NSManagedObjectModel?
和
class func mergedModelFromBundles(bundles: [AnyObject]?) -> NSManagedObjectModel!
请注意,最后一个中的bundles
被声明为可选项,而在第一个方法中它不是{\ n}。这意味着当您将nil
传递给mergedModelFromBundles
时,编译器会假设您想要接受nil
的那个,然后抱怨该方法没有第二个参数。
因此,如果要传递nil
,请使用单参数方法;如果要指定[AnyObject]
,请使用实际metadata
。
来自文档
有时可以使用模型 - 特别是框架中的模型 - 不同的情况,你可能想要指定不同的集合 在不同情况下使用的实体。例如,可能有 是某些实体,只有在用户拥有时才可用 行政特权。为了支持这一要求,模型可以 有多个配置。每个配置都有名称,并且具有 一组相关的实体。这些集可能重叠。你建立 配置以编程方式使用
setEntities:forConfiguration:
或 使用 Xcode设计工具,并检索给定的实体 配置名称使用entitiesForConfiguration:。
并在:
class func mergedModelFromBundles(_ bundles: [AnyObject]!) -> NSManagedObjectModel!
bundles
是:
要搜索的NSBundle实例数组。如果指定nil,则搜索主包。
并且:
class func mergedModelFromBundles(bundles: [AnyObject], forStoreMetadata metadata: [NSObject : AnyObject]) -> NSManagedObjectModel?
返回用于为其创建商店的托管对象模型 指定元数据。这个方法是一个伴侣
mergedModelFromBundles:
方法;在这种情况下,框架使用 存储在元数据中的版本信息,供商店定位 用于在可用包中创建商店的模型/实体,以及 返回模型。如果找不到商店的型号,请执行此操作 方法将返回nil。
答案 1 :(得分:0)
回答我自己的问题:
为了在swift中具有相同的行为,如下所示:
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:nil forStoreMetadata:sourceMetadata];
需要声明[NSBundle.mainBundle()]而不是nil,因为它没有接收可选项。这是正确的方法,因为您可以在NSBundle()文档中看到nil也被视为主要包。
let sourceModel = NSManagedObjectModel.mergedModelFromBundles([NSBundle.mainBundle()], forStoreMetadata: sourceMetadata)
我认为这是一个Apple bug,因为swift中有很多函数接受nil而不是NSBundle.mainBundle()。