Di Swift 2, kode berikut berfungsi:
let request = NSFetchRequest(entityName: String)
tetapi di Swift 3 ini memberikan kesalahan:
Parameter umum "ResultType" tidak dapat disimpulkan
karena NSFetchRequest
sekarang menjadi tipe generik. Dalam dokumen mereka, mereka menulis ini:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
jadi jika kelas hasil saya misalnya, Level
bagaimana saya harus meminta dengan benar?
Karena ini tidak berhasil:
let request: NSFetchRequest<Level> = Level.fetchRequest
let request: NSFetchRequest<Level> = Level.fetchRequest()
let request = Level.fetchRequest()
Jawaban:
atau
tergantung versi yang Anda inginkan.
Anda harus menentukan tipe generik karena jika tidak, pemanggilan metode akan ambigu.
Versi pertama ditentukan untuk
NSManagedObject
, versi kedua dibuat secara otomatis untuk setiap objek menggunakan ekstensi, misalnya:Intinya adalah menghapus penggunaan konstanta String.
sumber
Type 'Project Name' does not conform to protocol 'NSFetchRequestResult'
Saya pikir saya berhasil dengan melakukan ini:
setidaknya itu menyimpan dan memuat data dari DataBase.
Tapi sepertinya itu bukan solusi yang tepat, tapi berhasil untuk saat ini.
sumber
Struktur paling sederhana yang saya temukan yang berfungsi di 3.0 adalah sebagai berikut:
dimana Jenis entitas datanya adalah Negara.
Namun, ketika mencoba membuat Core Data BatchDeleteRequest, saya menemukan bahwa definisi ini tidak berfungsi dan tampaknya Anda harus menggunakan formulir:
meskipun format ManagedObject dan FetchRequestResult seharusnya setara.
sumber
if #available(iOS 10.0) { ... }
kondisionalBerikut beberapa metode CoreData umum yang mungkin menjawab pertanyaan Anda:
Dengan asumsi bahwa ada pengaturan NSManagedObject untuk Kontak seperti ini:
Metode ini dapat digunakan dengan cara berikut:
sumber
NSManagedObjectID
. Jadi sebelumcontext.delete(record)
menambahkanlet record = context.object(with: record.objectID)
dan menggunakan objek record untuk menghapus.Ini adalah cara termudah untuk bermigrasi ke Swift 3.0, cukup tambahkan
<Country>
(diuji dan bekerja)
sumber
Saya juga memiliki "ResultType" tidak bisa menjadi kesalahan yang disimpulkan. Mereka membersihkan setelah saya membangun kembali model data yang mengatur Codegen setiap entitas ke "Definisi Kelas". Saya melakukan penulisan singkat dengan petunjuk langkah demi langkah di sini:
Mencari tutorial yang jelas tentang revisi NSPersistentContainer di Xcode 8 dengan Swift 3
Yang saya maksud dengan "membangun kembali" adalah saya membuat file model baru dengan entri dan atribut baru. Agak membosankan, tapi berhasil!
sumber
Apa yang paling berhasil untuk saya sejauh ini adalah:
sumber
Saya memiliki masalah yang sama dan saya menyelesaikannya dengan langkah-langkah berikut:
Setelah melakukan itu saya harus menghapus / menulis ulang semua kejadian fetchRequest karena XCode tampaknya entah bagaimana bercampur dengan versi yang dibuat kode.
HTH
sumber
Swift 3.0 Ini seharusnya bekerja.
sumber