【问题标题】:mergedModelFromBundles in Swift not accepting optional argumentSwift中的mergedModelFromBundles不接受可选参数
【发布时间】: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)

【问题讨论】:

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


    【解决方案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()。

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2021-06-25
      • 2015-11-26
      相关资源
      最近更新 更多