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

Posted

技术标签:

【中文标题】多次加载的 Swift 惰性变量(计算属性?)【英文标题】:Swift Lazy Variables that Load more than Once (Computed Properties?) 【发布时间】:2015-01-19 00:50:34 【问题描述】:

我正在尝试翻译一些本质上是延迟加载变量多次的 Objective-C 代码。代码类似如下:

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

每当他们想重建 fetchedResultsController 以使用新的谓词时,他们只需将其设置为“nil”并调用它,它就会用新的谓词重建它。

我正在努力在 Swift 中完成同样的任务。据我所知,Swift 惰性变量在第一次被调用后就变成了普通变量。这给我带来了问题,因为如果我尝试将我的 swift 变量设置回 nil,并重新调用它,它不会重建,而是保持为 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
    ()

【问题讨论】:

【参考方案1】:

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

var _fetchedResultsController: NSFetchedResultsController?

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

【讨论】:

开发者现在应该做什么尴尬的事情((。非常感谢你【参考方案2】:

lazy 只是实现了一个非常具体的记忆模式。它并不像您有时希望的那样神奇。您可以很容易地实现自己的模式来匹配您的 ObjC 代码。

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

这与 ObjC 系统几乎相同。在 ObjC 中,你有两个“事物”,一个叫做 _fetchedResultsController,另一个叫做 self.fetchedResultsController。在 Swift 中,您将拥有两个东西,一个称为 self.fetchedResultsController,另一个称为 self._cachedFetchedResultsController(或其他)。

【讨论】:

谢谢,我注意到现在需要 self。

以上是关于多次加载的 Swift 惰性变量(计算属性?)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Swift 中的闭包设置惰性计算属性的值?

扩展中的延迟加载属性(Swift)

Swift 中的惰性属性相当于 Objective C 中的惰性 Init getter

全局变量/常量如何在 swift 中变得懒惰

swift之属性

如何在 Swift 中的变异结构上正确地创建惰性派生属性?