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不接受可选参数的主要内容,如果未能解决你的问题,请参考以下文章