web-dev-qa-db-ja.com

複雑なクロージャの戻り値の型を推測できません。明確にするために明示的なタイプを追加します

私が得ているこのエラーを解決する方法を誰かが知っていますか?エラーは、次のコードチャンクの最初の行で受信されます。

let fetchedResultsController: NSFetchedResultsController = {
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message")
    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
}()
7
random1234

次のコードのように、クロージャに戻り値の型を追加してみてください。

let fetchedResultsController: NSFetchedResultsController = { () -> NSFetchedResultsController<NSFetchRequestResult> in
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message")
    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
}()
8
Mukesh

エラーメッセージは少し誤解を招く可能性があります。問題は、変数の汎用プレースホルダータイプを指定しなかったことです。

@Mukeshが提案したように、明示的な戻り値の型をクロージャに追加することができます。その場合、変数の型注釈は必要ありません。

let fetchedResultsController = { () -> NSFetchedResultsController<NSFetchRequestResult> in
    // ...
    return frc
}()

または、変数の型を完全に指定すると、クロージャの戻り値の型が自動的に推測されます。

let fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult> = {
    // ...
    return frc
}()
3
Martin R

2問題:

  1. 他の回答で述べたように、ジェネリック型を指定する必要があります。あなたの場合、理想的な型は具象NSManagedObjectサブクラスです。
  2. NSFetchedResultsControllerの宣言には少なくとも1つのソート記述子が必要です

    let fetchedResultsController: NSFetchedResultsController<Message> = {
        let fetchRequest = NSFetchRequest<Message>(entityName: "Message")
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "somekey", ascending: true]
        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
    }()
    
0
vadian