2014-11-20 63 views
14

我試圖翻譯一些本質上是惰性加載變量多次的Objective-C代碼。該代碼是類似以下內容:加載多次(計算屬性?)的Swift惰性變量

-(NSFetchedResultsController *)fetchedResultsController { 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 
    //...code to build the fetchedResultsController with a new predicate 

每當他們想重建fetchedResultsController使用新的謂詞,他們只會將其設置爲「無」,並調用它,它會用新的謂詞重建它。

我正在努力在Swift中完成這個任務。據我所知,Swift懶惰變量在第一次被調用後變成正常變量。這對我造成了問題,因爲如果我嘗試將我的swift變量設置回零,然後回想起來,它不會重建,但仍然爲零。

將我的fetchedResultsController作爲懶惰變量載入的工作代碼如下。我試圖通過增加一個檢查來改變它到一個計算屬性,如果它的零,並在一個get塊內,但沒有奏效。有任何想法嗎?

lazy var taskController : NSFetchedResultsController? = { 
     var subtaskRequest = NSFetchRequest(entityName: "Subtasks") 
     var segIndex = self.segmentedControl.selectedSegmentIndex 
     subtaskRequest.predicate = NSPredicate(format: "task.category.name == %@", self.segmentedControl.titleForSegmentAtIndex(segIndex)!) 
     subtaskRequest.sortDescriptors = [NSSortDescriptor(key: "task.englishTitle", ascending: true), NSSortDescriptor(key: "sortOrder", ascending: true)] 


     let controller = NSFetchedResultsController(fetchRequest: subtaskRequest, managedObjectContext: 
      self.managedObjectContext!, sectionNameKeyPath: "task.englishTitle", cacheName: nil) 
     controller.delegate = self 
     return controller 
    }() 

回答

21

您可以使用由可選變量支持的計算屬性來創建與Objective-C方法類似的內容。

var _fetchedResultsController: NSFetchedResultsController? 

var fetchedResultsController: NSFetchedResultsController { 
    get { 
     if _fetchedResultsController != nil { 
      return _fetchedResultsController! 
     } 
     //create the fetched results controller... 
     return _fetchedResultsController! 
    } 
} 
+0

太棒了。這工作完美 – Unome 2014-11-21 00:03:07

+0

現在開發人員應該做些什麼尷尬的事情((。謝謝你很多 – 2015-12-09 14:01:02

5

lazy只是實現了一個非常具體的memoization模式。它不像你有時喜歡的那樣神奇。你可以很容易地實現你自己的模式來匹配你的ObjC代碼。

只需製作第二個保留真實價值的私有可選屬性。製作一個標準(非懶惰)計算屬性,檢查私有屬性是否爲零,如果它爲零,則更新它。

這與ObjC系統非常相似。在ObjC中,你有兩個「東西」,一個叫做_fetchedResultsController,另一個叫做self.fetchedResultsController。在斯威夫特你會有兩件事,一個叫self.fetchedResultsController,另一個叫self._cachedFetchedResultsController(或其他)。

+0

謝謝,我注意到自己現在需要。 – Unome 2014-11-21 00:03:24