यह उत्तर पढ़ें यदि त्रुटि संदेश कोर डेटा फ़ाइलों को संदर्भित करता है
Synopsis: आपके पास स्वतः उत्पन्न और मैन्युअल रूप से जेनरेट किया गया कोर डेटा प्रबंधित ऑब्जेक्ट क्लास फाइलें दोनों हो सकती हैं।
यह उत्तर लागू होता है यदि त्रुटि की पहली पंक्ति Foo + CoreDataProperties.o या Foo + CoreDataClass.o फ़ाइल को संदर्भित करती है । उदाहरण:
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
मूल कारण बिल्ड ट्रांसक्रिप्ट के संकलन स्विफ्ट स्रोत फ़ाइलें खंड का विस्तार करके देखा जा सकता है । उदाहरण के लिए:
<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'
आपकी परियोजना निर्देशिका में स्रोत फ़ाइल का उल्लेख किया गया है, जिसे किसी ने प्रोजेक्ट नेविगेटर में आपके डेटा मॉडल का चयन करके और मेनू संपादक > प्रबंधित प्रबंधित ऑब्जेक्ट उपवर्ग में क्लिक करके उत्पन्न किया है । यह सुविधा Xcode 7 या तो में जोड़ी गई थी।
दूसरी फ़ाइल उसी नाम की एक फ़ाइल है लेकिन जिसे Xcode में दफनाया गया है DerivedData
। इस फ़ाइल के दौरान स्वचालित रूप से Xcode द्वारा उत्पन्न होता है कि हर निर्माण करता है, तो डेटा मॉडल ( .xcdatamodeld
) फ़ाइल लक्ष्य के में शामिल है संकलित सूत्रों का कहना है निर्माण के चरण। यह सुविधा Xcode 9 या तो में जोड़ी गई थी। प्रत्येक इकाई / वर्ग के लिए शून्य, एक या दो फाइलें उत्पन्न होती हैं, जो कोडेन पॉपअप की सेटिंग पर निर्भर करता है । जब आप अपने डेटा मॉडल को संपादित करते समय किसी इकाई का चयन करते हैं तो वह पॉपअप डेटा मॉडल इंस्पेक्टर में होता है ...
सेटिंग्स हैं:
- मैनुअल / कोई नहीं फ़ाइलें उत्पन्न होती हैं
- श्रेणी / विस्तार एक फ़ाइल, फू + CoreDataProperties.m या .swift उत्पन्न होती है, जिसमें एक उद्देश्य-सी श्रेणी या स्विफ्ट एक्सटेंशन होता है।
- वर्ग परिभाषा वही श्रेणी / एक्सटेंशन फ़ाइल उत्पन्न होती है, और इसके अलावा एक Foo + CoreDataClass.m या .swift उत्पन्न होती है, जिसमें वर्ग घोषणा और परिभाषा होती है।
तो आप देखते हैं कि समस्या तब होती है जब एक डेवलपर (मेरे जैसे) जो पुराने Xcode का आदी होता है, एक नए Xcode में एक परियोजना शुरू करता है। हमें लगता है कि हमें Create Managed Object Subclass मेनू आइटम का उपयोग करने की आवश्यकता है , जो हम करते हैं, उन फ़ाइलों को बनाने के लिए जिन्हें हम प्रोजेक्ट नेविगेटर में देख सकते हैं, जबकि यह एहसास नहीं है कि कोडजेन पॉपअप में हमारी सेटिंग्स Xcode डुप्लिकेट फ़ाइलें बनाने के लिए पैदा कर रही हैं, जो Apple "चालाकी से" प्रोजेक्ट नेविगेटर में नहीं दिखता है, क्योंकि वे डेवलपर्स को पढ़ने के लिए विश्वास नहीं करते हैं और हेडर में टिप्पणी को ध्यान में रखते हैं // यह फ़ाइल स्वचालित रूप से उत्पन्न हुई थी और इसे संपादित नहीं किया जाना चाहिए।
समाधान 1 - पुराने तरीके का उपयोग करें
आप केवल एक सेटिंग के साथ डेटा मॉडल के लिए सभी स्वचालित कोडेन को अक्षम कर सकते हैं :
- समस्या का लक्ष्य खोलें चरण बनाएँ ( प्रोजेक्ट नेविगेटर में , प्रोजेक्ट का चयन करें, फिर TARGETS की सूची में , जो प्रकट होता है, समस्या लक्ष्य का चयन करें, फिर टैब बनाएँ चरण )।
- कंपाइल सोर्स प्रविष्टि का विस्तार करें और समस्या डेटा मॉडल (
.xcdatamodeld
फ़ाइल) ढूंढें ।
- इसे संकलन सूची से हटाएं
- सुनिश्चित करें कि डेटा मॉडल कॉपी बंडल रिसोर्स सूची में शामिल है।
समाधान 2 - शुरुआती के लिए कोर डेटा मैजिक
यहां, आप सभी नए तरीके से जाते हैं।
- अपने डेटा मॉडल को उस संकलन सूत्रों में छोड़ दें ।
- अपने डेटा मॉडल में प्रत्येक एंटिटी इंस्पेक्टर में कोडगेन को क्लास डेफिनिशन पर सेट करें ।
- प्रोजेक्ट नेविगेटर में, किसी भी Foo + CoreDataClass फ़ाइलों को हटाएं और उन्हें मिटा दें , और किसी भी Foo + CoreDataProperties.m या .swift फ़ाइलों को Foo + MyProperties जैसी किसी चीज़ में बदल दें ।
- प्रत्येक में फू + MyProperties.m या .swift फ़ाइल, अगर वहाँ Xcode द्वारा उत्पन्न गुण हैं, क्योंकि वे द्वारा बनाई छिपा फ़ाइलों में होगा इन गुणों को नष्ट Codegen ।
इस समाधान के साथ, आपकी कक्षा की परिभाषाएं प्रत्येक बिल्ड पर डेटा मॉडल से स्वचालित रूप से उत्पन्न होती हैं। आप उन्हें देख भी नहीं सकते। यह कोर डाटा मैजिक है , जो शुरुआती लोगों के लिए अच्छा और सरल है।
समाधान 3 - अधिकांश वास्तविक-विश्व ऐप्स के लिए
लेकिन यदि आप वास्तव में गैर-प्रबंधित गुण जोड़ना चाहते हैं तो समाधान 2 अच्छा नहीं है। (ऑब्जेक्टिव-सी संपत्तियों को श्रेणियों में जोड़ने की अनुमति नहीं देता है, और स्विफ्ट संग्रहीत संपत्तियों को एक्सटेंशन में जोड़ने की अनुमति नहीं देता है।) इसलिए अधिकांश वास्तविक दुनिया के ऐप्स में, आप शायद समाधान 1 और 2 के बीच आधे रास्ते पर जाना चाहते हैं ...
- अपने डेटा मॉडल को संकलित स्रोतों की सूची में छोड़ दें
- अपने डेटा मॉडल में प्रत्येक एंटिटी इंस्पेक्टर में, कोडगन को श्रेणी / एक्सटेंशन पर सेट करें ।
- परियोजना नेविगेटर में, हटा सकते हैं और कचरा किसी भी फू + CoreDataClass.m या .swift फ़ाइलें, और, भविष्य भ्रम को कम किसी भी नाम बदलने के लिए फू + CoreDataProperties.m या .swift शायद सिर्फ करने के लिए फ़ाइलों Foo.m या .swift ।
- सुनिश्चित करें कि प्रत्येक Foo.m या .swift फ़ाइल वर्ग परिभाषा, आप अपने खुद के गैर-प्रबंधित गुण जोड़ सकते हैं जो करने के लिए होता है।
(पोजीट्रान द्वारा उत्तर के लिए आभार। मेरा उत्तर यहां बताता है कि पोजीट्रान का उत्तर (मेरा समाधान 1) क्यों काम करता है, और समाधान 2 और समाधान 3 जोड़ता है)