2014-11-20 64 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