【问题标题】:Swift: Class parameter as default function parameterSwift:类参数作为默认函数参数
【发布时间】:2014-10-01 13:06:37
【问题描述】:

我正在尝试在 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
  }
}

一种解决方法是定义函数两次,一次有参数,一次没有,然后从没有给定上下文的函数中委托。

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

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

但这不是很好;-)

我的问题是关于参数的使用,如果 swift 的话,但是以这种方式封装核心数据的 cmets 也是受欢迎的。

【问题讨论】:

  • 为什么不使用Xcode6的最终版本而不是旧的beta4?
  • 在开始我的新项目之前下载了最新版本。现在尝试了 6A317 版本,同样的行为。

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


【解决方案1】:

但这不是很好;-)

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

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


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

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

【讨论】:

  • 绝对同意。也许我的动机是为了消除两次实现每个函数的编程工作以及自动完成列表中显示的函数的数量。
  • (猜测上面的 if-let-?? 会编译。应该非常相似。)
  • 适用于空大括号。即使不是解决方案,它也是一种比重载更便宜的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2012-02-03
  • 2016-08-30
  • 1970-01-01
  • 2019-09-11
  • 2010-10-03
相关资源
最近更新 更多