Hata mesajı Temel Veri dosyalarına başvuruyorsa bu yanıtı okuyun
Özet: Hem otomatik olarak oluşturulan hem de elle oluşturulan Temel Veriler tarafından yönetilen nesne sınıfı dosyalarınız olabilir.
Bu yanıt, hatanın ilk satırı bir Foo + CoreDataProperties.o veya Foo + CoreDataClass.o dosyasına başvuruyorsa geçerlidir . Misal:
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
Temel neden, Konuşma Metninin Derleme Hızlı Kaynak Dosyalarını Derle bölümü genişletilerek görülebilir . Örneğin:
<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'
Bahsedilen ilk dosya, proje dizininizde, bir kişinin Proje Gezgini'nde veri modelinizi seçip Düzenleyici > Yönetilen Nesne Alt Sınıfı menüsünü tıklatarak oluşturduğu bir kaynak dosyası vardır . Bu özellik Xcode 7 veya benzeri sürümlerde eklenmiştir.
İkinci dosya aynı adda ancak Xcode'larda gömülü bir dosyadır DerivedData
. Veri modeli ( ) dosyası hedefin Derleme Kaynakları oluşturma aşamasında bulunuyorsa bu dosya her derleme sırasında otomatik olarak Xcode tarafından oluşturulur . Bu özellik Xcode 9 ya da daha fazlasına eklendi. Codegen açılır penceresinin ayarına bağlı olarak her varlık / sınıf için sıfır, bir veya iki dosya oluşturulur . Veri modelinizi düzenlerken bir varlık seçtiğinizde bu açılır pencere Veri Modeli Denetçisi'nde ….xcdatamodeld
Ayarlar:
- Manuel / Hiçbiri Hiçbir dosya oluşturulmuyor
- Kategori / Uzantı Objective-C kategorisi veya Swift uzantısı içeren bir dosya, Foo + CoreDataProperties.m veya .swift dosyası oluşturulur.
- Sınıf Tanımı Aynı Kategori / Uzantı dosyası oluşturulur ve ek olarak sınıf bildirimi ve tanımı içeren bir Foo + CoreDataClass.m veya .swift oluşturulur.
Bu nedenle, eski Xcode'a alışkın olan bir geliştirici (benim gibi) daha yeni bir Xcode'da bir projeye başladığında sorun oluştuğunu görüyorsunuz. Codegen açılır penceresindeki ayarlarımızın Xcode'un Apple'ın yinelenen dosyalar oluşturmasına neden olduğunu fark etmeden Proje Gezgini'nde görebildiğimiz dosyaları oluşturmak için yaptığımız Yönetilen Nesne Alt Sınıfı Oluştur menü öğesini kullanmamız gerektiğini düşünüyoruz. "Akıllıca" Proje Gezgini'nde gösterilmez, çünkü geliştiricilerin // üstbilgideki yorumu okumak ve dikkate almak için güvenmezler. Bu dosya otomatik olarak oluşturulur ve düzenlenmemelidir.
Çözüm 1 - Eski Yolu Kullanın
Bir veri modeli için tüm otomatik Codegen öğelerini tek bir ayarla devre dışı bırakabilirsiniz :
- Sorunun Hedefin Derleme Aşamalarını açın ( Proje Gezgini'nde projeyi seçin, sonra görünen HEDEFLER listesinden sorunlu hedefi seçin, sonra Derleme Aşamaları sekmesine gidin ).
- Derleme Kaynakları girişini genişletin ve sorunlu veri modelini (
.xcdatamodeld
dosyayı) bulun.
- Derleme listesinden silin
- Veri modelinin Paket Kaynaklarını Kopyala listesinde bulunduğundan emin olun .
Çözüm 2 - Yeni Başlayanlar İçin Temel Veri Büyüsü
Burada, daha yeni bir yola girersiniz.
- Veri modelinizi bu Derleme Kaynaklarında olduğu gibi bırakın .
- Veri modelindeki her varlık Müfettişi olarak, set Codegen için Sınıf Tanımı .
- Proje Gezgini'nde tüm Foo + CoreDataClass dosyalarını silin ve çöp kutusuna atın ve Foo + CoreDataProperties.m veya .swift dosyalarını Foo + MyProperties gibi bir adla yeniden adlandırın .
- Her Foo + MyProperties.m veya .swift dosyasında, Xcode tarafından oluşturulan özellikler varsa, Codegen tarafından oluşturulan gizli dosyalarda olacağı için bu özellikleri silin .
Bu çözümle, sınıf tanımlarınız her derlemedeki veri modelinden otomatik olarak oluşturulur. Onları bile göremezsiniz. Öyle Çekirdek Veri Magic , yeni başlayanlar için güzel ve basit.
Çözüm 3 - Çoğu Gerçek Dünya Uygulaması için
Ancak, gerçekten yönetilmeyen özellikler eklemek istiyorsanız, Çözüm 2 iyi değildir. (Objective-C, kategorilere özelliklerin eklenmesine izin vermez ve Swift, depolanan özelliklerin uzantılara eklenmesine izin vermez.) Bu nedenle, çoğu gerçek dünya uygulamasında, muhtemelen Çözümler 1 ve 2'nin yarısına gitmek istersiniz…
- Veri modelinizi Derleme Kaynakları listesinde bırakın
- Veri modelindeki her varlık Müfettişi olarak, set Codegen için Kategori / Uzatma .
- Proje Gezgini'nde tüm Foo + CoreDataClass.m veya .swift dosyalarını silin ve çöpe atın ve gelecekteki karışıklığı azaltmak için Foo + CoreDataProperties.m veya .swift dosyalarını yalnızca Foo.m veya .swift olarak yeniden adlandırın .
- Her bir Foo.m veya .swift dosyasının kendi yönetilmeyen özelliklerinizi ekleyebileceğiniz sınıf tanımını içerdiğinden emin olun .
(Positron tarafından verilen cevaba teşekkür. Burada cevabım Positron'ın cevabının (benim Çözüm 1) neden çalıştığını açıklıyor ve Çözüm 2 ve Çözüm 3'ü ekliyor.)