Swift中的mergedModelFromBundles不接受可选参数

Posted

技术标签:

【中文标题】Swift中的mergedModelFromBundles不接受可选参数【英文标题】:mergedModelFromBundles in Swift not accepting optional argument 【发布时间】:2014-09-30 14:48:22 【问题描述】:

我正在关注关于核心数据的 Tim Roadley 书籍教程。我正在尝试快速执行迁移管理器,但出现此错误:Extra argument 'forStoreMetadata' in call。 这是因为这个方法是这样定义的:

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

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

NSManagedObjectModel.mergedModelFromBundles(bundles: [AnyObject]?)

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

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

【问题讨论】:

【参考方案1】:

两个类方法定义如下(Command-clickNSManagedObjectModel跳转到它的头部):

class func mergedModelFromBundles(bundles: [AnyObject], forStoreMetadata metadata: [NSObject : AnyObject]) -> NSManagedObjectModel?

和:

class func mergedModelFromBundles(bundles: [AnyObject]?) -> NSManagedObjectModel!

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

因此,如果您传递nil,请使用单参数方法,或者如果您想指定metadata,请提供实际的[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。

【讨论】:

但是我怎样才能将 nil 传递给 bundle 并仍然添加元数据? 我在回答中添加了更多信息。这能回答你的问题吗? 感谢您的详细解答。我已经理解你所说的,但如果我想做这样的事情,我仍然有同样的问题: NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergeModelFromBundles:nil forStoreMetadata:sourceMetadata];在 Swift 中这是不可能的,但在目标 c 中却是。【参考方案2】:

回答我自己的问题:

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

NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:nil forStoreMetadata:sourceMetadata]; 

需要声明 [NSBundle.mainBundle()] 而不是 nil,因为它没有接收可选项。这是正确的方法,因为你可以在 NSBundle() 文档中看到 nil 也被视为主要包。

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

我认为这是一个 Apple 错误,因为 swift 中有很多函数接受 nil 而不是 NSBundle.mainBundle()。

【讨论】:

以上是关于Swift中的mergedModelFromBundles不接受可选参数的主要内容,如果未能解决你的问题,请参考以下文章

swift: Swift 中的 SnapKit 不起作用

swift中的 isKindofClass

swift Swift中的变量

swift Swift中的数组

swift SWIFT中的变量

swift Swift4中的Codable