2014-10-01 62 views
0

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

在我的具体情况下,核心数据应该在额外创建的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 
} 

但是这还不是相当不错;-)

我的问题上的目标参数的用法是否迅速,但以这种方式封装的核心数据的意见,也欢迎。

+0

为什么你不使用最终版本的Xcode6而不是旧的beta4? – holex 2014-10-01 13:10:27

+0

在开始我的新项目之前下载了最新的版本。现在试用版本6A317,同样的行为。 – Guardian667 2014-10-01 13:26:07

回答

2

但是这还不是相当不错;-)

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

请记住,默认参数只是表达过载的快捷方式。您可以推送快捷方式的距离有限。


编辑:在这种特殊情况下,自然的解决办法是将参数转换为一个可选的(这是你的意思到底是什么,它是可选的)。

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

绝对同意。 也许我的动机是清除实现每个函数两次的编程工作以及自动完成列表中显示的函数的数量。 – Guardian667 2014-10-01 13:22:10

+0

(猜测上面的if-let- ??会编译,应该有类似的东西) – 2014-10-01 13:27:23

+0

与空的花括号一起使用。即使不是解决方案,它也是一种比超载更便宜的解决方法。 – Guardian667 2014-10-01 13:52:37