Swift中的mergedModelFromBundles不接受可选参数

时间:2014-09-30 14:48:23

标签: core-data swift migration core-data-migration

我跟随Tim Roadley关于Core Data的书籍教程。我试图在swift中做一个迁移管理器,但是我收到了这个错误:额外的争论' forStoreMetadata'在电话中。 这是因为这个方法定义如下:

NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject],
forStoreMetadata: [NSObject : AnyObject])

我认为这是错误的,因为它缺少捆绑包上的选项,如此定义:

NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject]?)

我该如何解决这个问题?我想做的是:

var sourceModel = NSManagedObjectModel.mergedModelFromBundles(nil, forStoreMetadata: sourceMetadata)

2 个答案:

答案 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()。