Значение типа '(Class) -> () -> (Class)' не имеет члена 'variable' - PullRequest
0 голосов
/ 02 мая 2018
let fetchedResultsController: NSFetchedResultsController = { () -> NSFetchedResultsController<NSFetchRequestResult> in
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message")
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
    fetchRequest.predicate = NSPredicate(format: "friend.name = %@", self.friend!.name!)
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    return frc
}()

В строке, которая говорит: fetchRequest.predicate = NSPredicate(format: "friend.name = %@", self.friend!.name!) Я получаю сообщение об ошибке: Value of type '(ChatLogController) -> () -> (ChatLogController)' has no member 'friend' Так, очевидно, он не может найти friend в моем классе ChatLogController по какой-то причине, или я ошибаюсь? Это то, что я предполагаю, так как friend не будет входить в self.

Вот переменная friend, она внутри класса ChatLogController:

var friend: Friend?
{
    didSet
    {
        navigationItem.title = friend?.name

        messages = friend?.messages?.allObjects as? [Message]

        messages = messages?.sorted(by: {$0.date!.compare($1.date! as Date) == .orderedAscending})
    }
}

Кто-нибудь знает, почему я получаю эту ошибку и как ее решить?

Редактировать: Я заметил, что если я удаляю () -> NSFetchedResultsController<NSFetchRequestResult> in из первой строки первого фрагмента кода, ошибка исчезает, однако вместо этого я получаю эту ошибку: Unable to infer complex closure return type; add explicit type to disambiguate

1 Ответ

0 голосов
/ 02 мая 2018

Вы объявили друга как свойство optional, которое не было инициализировано во время initialisation fetchedResultsController, который является константой, поэтому он выдает ошибку. Для решения этой проблемы вы можете использовать lazy initialisation, что означает

задержка создания объекта или другого дорогостоящего процесса пока не понадобится

делает свойство fetchedResultsController ленивым, что будет задерживать создание объекта до тех пор, пока его не потребуется

lazy var fetchedResultsController: NSFetchedResultsController = { [unowned self] () -> NSFetchedResultsController<NSFetchRequestResult> in
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message")
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
    fetchRequest.predicate = NSPredicate(format: "friend.name = %@", self.friend!.name!)
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    return frc
}()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...