2014-10-01 60 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