1. ホーム
  2. swift

[解決済み] NSFetchRequestのインスタンスに型を適用する方法は?

2022-11-20 07:38:11

質問

Swift 2では、以下のコードが動作していました。

let request = NSFetchRequest(entityName: String)

と記述しても、Swift 3ではエラーになります。

Generic parameter "ResultType" を推論することができませんでした。

なぜなら NSFetchRequest が一般的な型になったからです。彼らのドキュメントではこう書かれています。

let request: NSFetchRequest<Animal> = Animal.fetchRequest

ということで、例えば結果クラスが Level である場合、どのようにリクエストすればよいのでしょうか?

これは動作しないためです。

let request: NSFetchRequest<Level> = Level.fetchRequest

どのように解決するのですか?

let request: NSFetchRequest<NSFetchRequestResult> = Level.fetchRequest()

または

let request: NSFetchRequest<Level> = Level.fetchRequest()

どのバージョンにするかによって

ジェネリックタイプを指定しないと、メソッド呼び出しが曖昧になるからです。

最初のバージョンは NSManagedObject に対して定義され、2 番目のバージョンは拡張子を使うすべてのオブジェクトに対して自動的に生成されます。

extension Level {
    @nonobjc class func fetchRequest() -> NSFetchRequest<Level> {
        return NSFetchRequest<Level>(entityName: "Level");
    }

    @NSManaged var timeStamp: NSDate?
}

要はString定数の使い回しをなくすことです。