【问题标题】:Swift Lazy Variables that Load more than Once (Computed Properties?)多次加载的 Swift 惰性变量(计算属性?)
【发布时间】: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
    }()

【问题讨论】:

    标签: ios objective-c swift lazy-loading


    【解决方案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。
    猜你喜欢
    • 2018-06-11
    • 2017-03-04
    • 2014-09-22
    • 1970-01-01
    • 2020-03-03
    • 2014-12-28
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多