Saya menduplikasi aplikasi Acara TV Objective-C yang ada ke versi Swift baru menggunakan Xcode 6.1 dan saya mengalami beberapa masalah dengan CoreData.
Saya telah membuat model 4 entitas, membuat subkelas NSManagedObject mereka (di Swift), dan semua file memiliki target aplikasi yang tepat (untuk 'Sumber Kompilasi').
Saya masih mendapatkan kesalahan ini setiap kali saya mencoba memasukkan entitas baru:
CoreData: peringatan: Tidak dapat memuat kelas bernama 'Shows' untuk entitas 'Shows'. Kelas tidak ditemukan, menggunakan NSManagedObject default sebagai gantinya.
Beberapa komentar:
Saat menyimpan ke Data Inti, saya menggunakan cara konteks orang tua-anak untuk memungkinkan penguliran latar belakang. Saya melakukan ini dengan menyiapkan ManagedObjectContext menggunakan:
lazy var managedObjectContext: NSManagedObjectContext? = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
dan dengan menyimpan data menggunakan:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
context.parentContext = self.managedObjectContext!
...rest of core data saving code here...
})
sumber
@objc(MyClass)
Tetapi bagi mereka yang menggunakan
@objc(myEntity)
Swift (seperti saya), Anda dapat menggunakan solusi lain ini yang berfungsi dengan lancar.Di kelas xcdatamodel yang benar masuk Ini akan terlihat seperti ini:
Ini dia.
Module.Class
adalah pola untuk CoreData di Swift dan XCode 6. Anda juga memerlukan prosedur yang sama saat menggunakan kelas Kebijakan Kustom dalam Kebijakan Model atau hal-hal CoreData lainnya. Catatan: Dalam gambar, Nama dan Kelas harus Mobil dan MyAppName.Car (atau apa pun nama entitas Anda). Di sini,User
ada kesalahan ketik.sumber
Car
untuk kedua bidang itu berhasil.Saat menggunakan Xcode 7 dan Swift murni, saya benar-benar harus menghapus
@objc(MyClass)
dariNSManagedObject
subclass yang dibuat secara otomatis (dihasilkan dari Editor> Create NSManagedObject Subclass...).sumber
Dalam Xcode 7 beta 2 (dan saya percaya 1), dalam konfigurasi model, jenis objek yang dikelola baru
File
diatur ke ModulCurrent Product Module
dan kelas objek ditampilkan dalam konfigurasi sebagai.File
.Menghapus pengaturan modul sehingga kosong, atau menghapus tanda titik sehingga nama kelas dalam konfigurasi hanyalah
File
tindakan yang setara, karena masing-masing menyebabkan perubahan lainnya. Menyimpan konfigurasi ini akan menghapus kesalahan yang dijelaskan.sumber
Di Xcode 6.1.1 Anda tidak perlu menambahkan atribut @objc karena entitas dasar adalah bagian dari kelas objc (NSManagedObject) (lihat Kompatibilitas Tipe Swift . Di CoreData, nama Module.Class lengkap diperlukan. name adalah apa yang disetel di Setelan Bangun -> Pengemasan -> Nama Modul Produk. Secara default disetel ke $ (PRODUCT_NAME: c99extidentifier) yang akan menjadi nama Target .
sumber
my-product
menjadimy_product
, dan ini membuat semua perbedaan pada Data Inti.Dengan versi xCode 7 dan Swift 2.0, Anda tidak perlu menambahkan @objc (NameOfClass), cukup ubah pengaturan entitas di tab "Tampilkan Inspektur Model Data" seperti di bawah -
Nama - "Nama Entitas Anda"
Kelas - "Nama Entitas Anda"
Modul - "Modul Produk Saat Ini"
Kode untuk file kelas Entitas akan seperti (dalam kode saya Entitas adalah Keluarga) -
Contoh ini berfungsi dengan baik di aplikasi saya dengan xCode 7.0 + swift 2.0
sumber
Jangan lupa ganti
PRODUCT_MODULE_NAME
dengan nama modul produk Anda.Saat entitas baru dibuat, Anda harus masuk ke Pemeriksa Model Data (tab terakhir) dan mengganti
PRODUCT_MODULE_NAME
dengan nama modul Anda, atau itu akan mengakibatkanclass not found
kesalahan saat membuat koordinator penyimpanan persisten.sumber
Anda juga perlu menggunakan (setidaknya dengan Xcode 6.3.2) Module.Class saat melakukan cast Anda misalnya: Dengan asumsi modul Anda (yaitu nama produk) adalah Makanan dan kelas Anda adalah Buah
Rekap:
sumber
Saya juga mengalami masalah serupa, ikuti langkah-langkah berikut untuk menyelesaikannya:
sumber
Mengubah nama Kelas Entitas di editor Model Data agar sesuai dengan kelas yang dimaksud dan menambahkan
@objc(NameOfClass)
ke file dari setiap NSManagedObject tepat di atas deklarasi kelas memecahkan masalah ini untuk saya selama Pengujian Unit.sumber
Apa yang berhasil untuk saya (Xcode 7.4, Swift) adalah mengubah nama kelas menjadi
<my actual class name>.<entity name>
di inspektur Entitas, kotak 'Kelas'.Pemrakarsa saya dari subkelas objek Terkelola, terlihat seperti ini:
sumber
Untuk Xcode 11.5: jika properti Codegen adalah class Definition, dan jika Anda tidak mendapatkan saran untuk entitas yang Anda buat di xcdatamodel. Coba keluar dari Xcode dan buka kembali proyek Anda. Ini bekerja untuk saya. Jawaban ini hanya jika Anda tidak mendapatkan saran tetapi jika file Anda tidak dihasilkan, coba jawaban di atas.
sumber