core-data - Swift:类参数作为默认函数参数

标签 core-data swift optional-parameters class-variables

我正在尝试在 Swift 中定义默认函数参数。默认情况下,应使用此类中的引用(函数 loadMyEntities(...))。 Xcode (v6 Beta 4) 显示 Use of unresolved Identifier 'self'。仅使用 context 而不是 self.context 会导致错误 'DB.Type' does not have a member named 'context'。我该如何处理这个问题,以使用“引用后面的值”作为默认参数。

在我的特定情况下,核心数据应该在额外创建的 NSManagedObjectContext 或默认上下文中加载实体。

class DB {
  var appDelegate: AppDelegate
  var context: NSManagedObjectContext
  var persistenceCoordinater: NSPersistentStoreCoordinator

  init() {
    self.appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    self.context = appDelegate.managedObjectContext!
    self.persistenceCoordinater = context.persistentStoreCoordinator
  }

  // !!! Here's the point where I want to use the DB objects context as default !!!
  func loadMyEntities(context: NSManagedObjectContext = self.context) -> [MyEntity] {
    // loading entities
  }

  // This function can be used 
  func createContext() -> NSManagedObjectContext {
    var newContext = NSManagedObjectContext()
    newContext.persistentStoreCoordinator = self.persistenceCoordinater
    return newContext
  }
}

一个解决方法是定义函数两次,一次有参数,一次没有,并从没有给定上下文的参数中委托(delegate)。

func loadMyEntities() -> [MyEntity] {
  return loadMyEntities(self.context)
}

func loadMyEntities(context: NSManagedObjectContext) -> [MyEntity] {
    // loading entities
}

但这不是很好 ;-)

我的问题针对的是 swift 参数的使用,但也欢迎评论以这种方式封装核心数据。

最佳答案

But that's not pretty nice ;-)

重载方法没有错。它非常清晰和灵活。这就是重载的目的。到目前为止,我已经遇到过无数次这种情况,并且一直被提醒过于复杂的默认值是错误的解决方案。 Swift 有重载是有原因的。他们正好解决了这里的问题。

请记住,默认参数只是表达重载的快捷方式。可以将快捷方式推到多远是有限制的。


编辑:在这种特殊情况下,自然的解决方案是将参数转换为可选参数(这正是您的意思;它是可选的)。

func loadMyEntities(context: NSManagedObjectContext? = nil) -> [MyEntity] {
    if let context = context ?? self.context {
        ...
    }
}

关于core-data - Swift:类参数作为默认函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142111/

相关文章:

arrays - flatMap 中的 "Cannot convert return expression",其中包含无意义的表达式

c++ - 是否可以将 "fill"函数参数(默认为 null)与对象一起使用?

smalltalk - 我如何使用 Smalltalk 的内置解析器或编译器来解析我自己的带有可选参数的消息?

ios - 从 TableView 中删除行时 CoreData 应用程序崩溃

ios - 魔法记录 : crash when fetching data in background thread

ios - NSManagedObjectContext -保存: causing SIGSEGV crash

swift - 带有 2 个链接的 UITextView 属性文本,每个链接都有不同的颜色不起作用

ios - 核心数据+ swift 2 : Many-To-Many relation not working for three tables

ios - 如何为 iOS App 设置默认语言设置

wcf - WCF 客户端的可选枚举