Core data Swift中的mergedModelFromBundles不接受可选参数

Core data Swift中的mergedModelFromBundles不接受可选参数,core-data,swift,migration,core-data-migration,Core Data,Swift,Migration,Core Data Migration,我正在关注Tim Roadley关于核心数据的书籍教程。我试图用swift做一个迁移管理器,但我得到了这个错误:调用中有额外的参数'forStoreMetadata'。 这是因为此方法的定义如下: NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject], forStoreMetadata: [NSObject : AnyObject]) 我认为这是错误的,因为它在bundle上缺少一个选项,如下面定义的: NSManag

我正在关注Tim Roadley关于核心数据的书籍教程。我试图用swift做一个迁移管理器,但我得到了这个错误:调用中有额外的参数'forStoreMetadata'。 这是因为此方法的定义如下:

NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject],
forStoreMetadata: [NSObject : AnyObject])
我认为这是错误的,因为它在bundle上缺少一个选项,如下面定义的:

NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject]?)
我怎样才能解决这个问题?我想做的是:

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

这两个类方法的定义如下(命令单击
NSManagedObjectModel
跳转到其标题):

以及:

注意,
bundles
在最后一个方法中声明为可选,而在第一个方法中则不是。这意味着当您将
nil
传递给
mergedModelFromBundles
时,编译器假定您想要接受
nil
的方法,然后抱怨该方法没有第二个参数

因此,如果要传递
nil
,请使用单参数方法;如果要指定
元数据,请提供实际的
[AnyObject]

来自文档

有时,一个模型,特别是框架中的模型,可以在 不同的情况下,您可能需要指定不同的 在不同情况下使用的实体。比如说,, 某些实体应仅在用户拥有时可用 管理特权。为了支持这一要求,模型可以 具有多个配置。每个配置都已命名,并且具有 一组相关联的实体。这些集合可能重叠。你建立 以编程方式使用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


回答我自己的问题:

为了在swift中具有如下相同的行为:

NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:nil forStoreMetadata:sourceMetadata]; 
需要声明[NSBundle.mainBundle()],而不是nil,因为它没有接收可选的。这是正确的方法,因为正如您在NSBundle()文档中看到的那样,nil也被视为主捆绑包

let sourceModel = NSManagedObjectModel.mergedModelFromBundles([NSBundle.mainBundle()], forStoreMetadata: sourceMetadata)

我认为这是一个苹果漏洞,因为swift中有很多函数接受nil而不是NSBundle.mainBundle()。

但是我如何将nil传递给bundle并仍然添加元数据呢?我在回答中添加了更多信息。这回答了你的问题吗?谢谢你详细的回答。我理解你说的话,但如果我想做这样的事情,我仍然有同样的问题:NSManagedObjectModel*sourceModel=[NSManagedObjectModel mergedModelFromBundles:nil forStoreMetadata:sourceMetadata];在Swift中是不可能的,但在目标c中是可能的。
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:nil forStoreMetadata:sourceMetadata]; 
let sourceModel = NSManagedObjectModel.mergedModelFromBundles([NSBundle.mainBundle()], forStoreMetadata: sourceMetadata)