Я пытаюсь перевести некоторый код Objective-C, который по существу лениво загружал переменную несколько раз. Код был похож на следующий:
-(NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
//...code to build the fetchedResultsController with a new predicate
Всякий раз, когда они хотели перестроить fetchedResultsController для использования нового предиката, они просто устанавливали его в «nil» и вызывали его, и он перестраивал его с новым предикатом.
Я изо всех сил пытаюсь выполнить эту же задачу в Swift. Насколько я могу судить, ленивые переменные Swift становятся обычными переменными после первого вызова. Это вызывает у меня проблемы, потому что, если я попытаюсь установить для своей быстрой переменной значение nil и вспомнить ее, она не перестроится, а останется нулевой.
Ниже приведен рабочий код для загрузки моего 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
}()