多次加载的 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 惰性变量(计算属性?)的主要内容,如果未能解决你的问题,请参考以下文章