加载多次的Swift Lazy变量(计算属性?)

Uno*_*ome 15 lazy-loading objective-c ios swift

我正在尝试翻译一些基本上懒惰加载变量的Objective-C代码.代码类似于以下内容:

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

每当他们想要重建fetchedResultsController以使用新的谓词时,他们只需将其设置为"nil"并调用它,它将使用新的谓词重建它.

我正在努力在Swift中完成同样的任务.据我所知,Swift懒惰变量在第一次被调用后成为正常变量.这对我来说是个问题,因为如果我尝试将我的swift变量设置为nil并回想起来,它就不会重建但仍然是零.

将fetchedResultsController加载为惰性变量的工作代码如下所示.我已经尝试将它更改为计算属性,方法是添加一个检查它是否为nil并将其放在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
    }()
Run Code Online (Sandbox Code Playgroud)

Con*_*nor 22

您可以使用由可选变量支持的计算属性创建类似于Objective-C方法的内容.

var _fetchedResultsController: NSFetchedResultsController?

var fetchedResultsController: NSFetchedResultsController {
    get {
        if _fetchedResultsController != nil {
            return _fetchedResultsController!
        }
        //create the fetched results controller...
        return _fetchedResultsController!
    }
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ier 6

lazy只是实现了一个非常具体的memoization模式.它并不像你有时喜欢的那样神奇.您可以非常轻松地实现自己的模式以匹配您的ObjC代码.

只需创建一个包含实际值的第二个私有可选属性.创建一个标准(非惰性)计算属性,检查私有属性是否为nil,如果为零,则更新它.

这与ObjC系统非常相似.在ObjC中,你有两个"东西",一个叫_fetchedResultsController,另一个叫self.fetchedResultsController.在Swift中你会有两件事,一件叫self.fetchedResultsController,另一件叫self._cachedFetchedResultsController(或其他).