Baca jawaban ini jika pesan kesalahan merujuk file Data Inti
Sinopsis: Anda mungkin memiliki file kelas objek yang dikelola secara otomatis dan buatan Core Data yang dihasilkan secara manual.
Jawaban ini berlaku jika baris pertama kesalahan merujuk ke file Foo + CoreDataProperties.o atau Foo + CoreDataClass.o . Contoh:
error: Multiple commands produce '/Users/me/Library/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/ MyApp /Debug-iphonesimulator/ MyApp.build/Objects-normal/x86_64/Foo+CoreDataProperties.o':
1) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
2) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
Penyebab root dapat dilihat dengan memperluas bagian Compile Swift Source Files dari Build Transcript. Sebagai contoh:
<unknown>:0: error: filename "Address+CoreDataClass.swift" used twice: '/Users/myUserName/Projects/Jnky/Foo+CoreDataProperties' and '/Users/jk/myUserName/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/MyApp.build/Debug/MyApp.build/DerivedSources/CoreDataGenerated/Jnky/Foo+CoreDataProperties.swift'
File pertama yang disebutkan ada file sumber di direktori proyek Anda, yang dihasilkan oleh seseorang dengan memilih model data Anda di Project Navigator dan mengklik menu Editor > Buat Subclass Obyek yang Dikelola . Fitur ini ditambahkan dalam Xcode 7 atau lebih.
File kedua adalah file dengan nama yang sama tetapi yang dimakamkan di Xcode DerivedData
. File ini dihasilkan secara otomatis oleh Xcode selama setiap build jika file data model ( .xcdatamodeld
) termasuk dalam fase build Compile Sources target . Fitur ini ditambahkan dalam Xcode 9 atau lebih. Nol, satu atau dua file dihasilkan untuk setiap entitas / kelas, tergantung pada pengaturan popup Codegen . Munculan itu ada di Inspektur Model Data ketika Anda memilih entitas saat mengedit model data Anda ...
Pengaturannya adalah:
- Manual / Tidak Ada Ada ada file yang dihasilkan
- Kategori / Ekstensi Satu file, Foo + CoreDataProperties.m atau .swift dihasilkan, berisi kategori Objective-C atau ekstensi Swift.
- Definisi Kelas File Kategori / Ekstensi yang sama dihasilkan, dan selain itu Foo + CoreDataClass.m atau .swift dihasilkan, berisi deklarasi dan definisi kelas.
Jadi Anda melihat masalah terjadi ketika pengembang (seperti saya) yang terbiasa dengan Xcode yang lebih lama memulai proyek dalam Xcode yang lebih baru. Kami berpikir bahwa kami perlu menggunakan item menu Buat Subjek Obyek yang Dikelola , yang kami lakukan, untuk membuat file yang dapat kami lihat di Project Navigator sambil tidak menyadari bahwa pengaturan kami di popup Codegen menyebabkan Xcode membuat file duplikat, yang oleh Apple "cerdik" tidak muncul di Navigator Proyek, karena mereka tidak percaya pengembang untuk membaca dan mengindahkan komentar di header // File ini secara otomatis dihasilkan dan tidak boleh diedit.
Solusi 1 - Gunakan Cara Lama
Anda dapat menonaktifkan semua Codegen otomatis untuk model data hanya dengan satu pengaturan:
- Buka fase Fase Bangun Target (Di Project Navigator , pilih proyek, lalu dalam daftar TARGET yang muncul, pilih target masalah, lalu tab Bangun Fase ).
- Perluas entri Sumber Kompilasi dan temukan model data masalah (
.xcdatamodeld
file).
- Hapus dari daftar kompilasi
- Pastikan model data termasuk dalam daftar Sumber Daya Bundel Salin .
Solusi 2 - Core Data Magic Untuk Pemula
Di sini, Anda melakukan semuanya dengan cara yang lebih baru.
- Biarkan model data Anda seperti pada Kompilasi Sumber itu .
- Di setiap Inspektur Entitas dalam model data Anda, setel Codegen ke Definisi Kelas .
- Di Project Navigator, hapus dan buang semua file Foo + CoreDataClass , dan ganti nama file Foo + CoreDataProperties.m atau .swift menjadi sesuatu seperti Foo + MyProperties .
- Di setiap file Foo + MyProperties.m atau .swift , jika ada properti yang dihasilkan oleh Xcode, hapus properti ini karena mereka akan berada di file tersembunyi yang dibuat oleh Codegen .
Dengan solusi ini, definisi kelas Anda dihasilkan secara otomatis dari model data pada setiap build. Anda bahkan tidak bisa melihatnya. Ini adalah Core Data Magic , bagus dan sederhana untuk pemula.
Solusi 3 - Untuk Sebagian Besar Aplikasi Dunia Nyata
Tetapi Solusi 2 tidak baik jika Anda benar-benar ingin menambahkan properti yang tidak dikelola. (Objective-C tidak memungkinkan properti ditambahkan dalam kategori, dan Swift tidak mengizinkan properti tersimpan ditambahkan dalam ekstensi.) Jadi di sebagian besar aplikasi dunia nyata, Anda mungkin ingin setengah jalan antara Solusi 1 dan 2 ...
- Tinggalkan model data Anda dalam daftar Sumber Kompilasi
- Di setiap Inspektur Entitas dalam model data Anda, setel Codegen ke Kategori / Ekstensi .
- Di Project Navigator, hapus dan buang file Foo + CoreDataClass.m atau .swift , dan, untuk mengurangi kebingungan di masa mendatang, ubah nama file Foo + CoreDataProperties.m atau .swift menjadi mungkin hanya Foo.m atau .swift .
- Pastikan bahwa setiap Foo.m atau .swift file berisi definisi kelas, yang Anda dapat menambahkan sendiri non-dikelola properti Anda.
(Ucapan terima kasih atas jawaban oleh Positron. Jawaban saya di sini menjelaskan mengapa jawaban Positron (Solusi saya 1) berfungsi, dan menambahkan Solusi 2 dan Solusi 3.)