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
@JeremyP Какую часть кода вы хотите увидеть? А как мне сделать, чтобы self
указывал на класс? Оба фрагмента кода, которыми я поделился, находятся в ChatLogController
.
Вы объявили friend как свойство optional
, которое не было инициализировано во время initialisation
для fetchedResultsController, которое является константой, поэтому выдает ошибку. Чтобы решить эту проблему, вы можете использовать lazy initialisation
, что означает
delaying the creation of an object or some other expensive process until it’s needed
сделать свойство 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
}()
Вам необходимо показать оба этих фрагмента кода в том контексте, в котором они объявлены. Например, в первом фрагменте компилятор не думает, что
self
- этоChatLogController
, он думает, что это закрытие некоторого описания.