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

时间:2014-10-01 13:06:37

标签: 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'。我如何处理这个问题,使用"引用后面的值?#34;作为默认参数。

在我的特定情况下,核心数据应该在额外创建的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的参数用法为目标,但也欢迎以这种方式封装核心数据的评论。

1 个答案:

答案 0 :(得分:2)

  

但那不是很好; - )

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

请记住,默认参数只是表达重载的快捷方式。你可以在多大程度上推动捷径。


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

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