Core data Swift:类参数作为默认函数参数

Core data Swift:类参数作为默认函数参数,core-data,swift,optional-parameters,class-variables,Core Data,Swift,Optional Parameters,Class Variables,我试图在Swift中定义一个默认函数参数。默认情况下,应使用此类中的引用(函数loadMyEntities(…))。Xcode(v6 Beta 4)显示未解析标识符“self”的使用。仅使用context而不是self.context会导致错误“DB.Type”没有名为“context”的成员。如何处理这个问题,使用“引用后面的值”作为默认参数 在我的特定情况下,核心数据应该在额外创建的NSManagedObjectContext或默认上下文中加载实体 class DB { var appD

我试图在Swift中定义一个默认函数参数。默认情况下,应使用此类中的引用(函数
loadMyEntities(…)
)。Xcode(v6 Beta 4)显示未解析标识符“self”的使用
。仅使用
context
而不是
self.context
会导致错误
“DB.Type”没有名为“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
  }
}
一种解决方法是定义函数两次,一次使用参数,一次不使用参数,以及从没有给定上下文的函数中进行委托

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

func loadMyEntities(context: NSManagedObjectContext) -> [MyEntity] {
    // loading entities
}
但这不太好;-)

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

但这不太好;-)

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

记住,默认参数只是表示重载的快捷方式。你可以把一条捷径推多远是有限制的


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


为什么不使用Xcode6的最终版本而不是旧的beta4?在开始我的新项目之前,我已经下载了最新的verison。现在试过版本6A317,同样的行为。绝对同意。也许我的动机是为了清除两次实现每个函数的编程工作,以及自动完成列表中显示的函数数量。(猜测上面的if-let-??将编译。非常类似的东西应该会编译。)使用空的花括号工作。即使不是解决方案,它也比重载便宜。
func loadMyEntities(context: NSManagedObjectContext? = nil) -> [MyEntity] {
    if let context = context ?? self.context {
        ...
    }
}