อ่านคำตอบนี้หากข้อความแสดงข้อผิดพลาดอ้างอิงไฟล์ Core Data
เรื่องย่อ: คุณอาจมีทั้งคลาสไฟล์อ็อบเจ็กต์ข้อมูลที่จัดการโดย Core และสร้างด้วยตนเอง
คำตอบนี้นำไปใช้ถ้าบรรทัดแรกของข้อผิดพลาดหมายถึงฟู + CoreDataProperties.oหรือฟู + 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
สาเหตุที่แท้จริงสามารถมองเห็นได้โดยการขยายส่วนไฟล์ที่มาคอมไพล์ Swiftของ Build Transcript ตัวอย่างเช่น:
<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 หรือมากกว่านั้น
แฟ้มที่สองคือไฟล์ที่มีชื่อเดียวกัน แต่ที่ถูกฝังอยู่ใน DerivedData
Xcode ไฟล์นี้สร้างขึ้นโดยอัตโนมัติโดย Xcode ในทุกบิลด์หากไฟล์ data model ( .xcdatamodeld
) รวมอยู่ในเฟสการคอมไพล์ Sourcesของเป้าหมาย คุณสมบัตินี้ถูกเพิ่มเข้ามาใน Xcode 9 หรือมากกว่านั้น ศูนย์หนึ่งหรือสองไฟล์ถูกสร้างขึ้นสำหรับแต่ละเอนทิตี้ / คลาสขึ้นอยู่กับการตั้งค่าของป๊อปอัปCodegen ป๊อปอัพนั้นอยู่ในตัวตรวจสอบตัวแบบข้อมูลเมื่อคุณเลือกเอนทิตีในขณะที่แก้ไขตัวแบบข้อมูลของคุณ ...
การตั้งค่าคือ:
- แมนนวล / ไม่มีไม่มีไฟล์ที่สร้างขึ้น
- หมวดหมู่ / นามสกุลหนึ่งไฟล์Foo + CoreDataProperties.mหรือ. swiftถูกสร้างขึ้นซึ่งมีหมวดหมู่ Objective-C หรือส่วนขยาย Swift
- คำจำกัดความของคลาสไฟล์ประเภท / นามสกุลเดียวกันถูกสร้างขึ้นและนอกจากนี้ยังสร้างFoo + CoreDataClass.mหรือ. swiftซึ่งมีการประกาศและคำจำกัดความของคลาส
ดังนั้นคุณจะเห็นปัญหาเกิดขึ้นเมื่อนักพัฒนาซอฟต์แวร์ (เช่นฉัน) ที่คุ้นเคยกับ Xcode รุ่นเก่าเริ่มโครงการใน Xcode รุ่นใหม่ เราคิดว่าเราต้องใช้รายการเมนูCreate Managed Object Subclassซึ่งเราทำเพื่อสร้างไฟล์ที่เราเห็นใน Project Navigator โดยไม่ทราบว่าการตั้งค่าของเราในป๊อปอัปCodegenทำให้ Xcode สร้างไฟล์ซ้ำกันซึ่ง Apple "ชาญฉลาด" ไม่แสดงใน Project Navigator เพราะพวกเขาไม่เชื่อถือนักพัฒนาที่จะอ่านและฟังความคิดเห็นในส่วนหัว// ไฟล์นี้ถูกสร้างขึ้นโดยอัตโนมัติและไม่ควรแก้ไข
โซลูชันที่ 1 - ใช้วิธีเก่า
คุณสามารถปิดการใช้งานCodegenอัตโนมัติทั้งหมดสำหรับรูปแบบข้อมูลด้วยการตั้งค่าเดียว:
- เปิดปัญหาของเป้าหมายเฟสรูปร่าง (ในโครงการ Navigatorเลือกโครงการแล้วในรายการของเป้าหมายที่ปรากฏขึ้นให้เลือกเป้าหมายปัญหาแล้วแท็บขั้นตอนการสร้าง )
- ขยายรายการCompile Sourcesและค้นหาโมเดลข้อมูลปัญหา (
.xcdatamodeld
ไฟล์)
- ลบออกจากรายการรวบรวม
- ให้แน่ใจว่ารูปแบบข้อมูลที่ถูกรวมอยู่ในการคัดลอก Bundle ทรัพยากรรายการ
โซลูชันที่ 2 - Core Data Magic สำหรับผู้เริ่มต้น
ที่นี่คุณจะไปในทางที่ใหม่กว่า
- ปล่อยให้โมเดลข้อมูลของคุณอยู่ในแหล่งรวบรวมนั้น
- ในแต่ละ Entity สารวัตรในรูปแบบข้อมูลของคุณตั้งโค๊ดเจนให้กับชั้นความหมาย
- ในการโครงการนาวิเกเตอร์, ลบและถังขยะใด ๆฟู + CoreDataClassไฟล์และเปลี่ยนชื่อใด ๆฟู + CoreDataProperties.mหรือ.swiftไฟล์ไปยังสิ่งที่ต้องการฟู + MyProperties
- ในแต่ละฟู + MyProperties.mหรือ.swiftไฟล์ถ้ามีคุณสมบัติที่สร้างขึ้นโดย Xcode ลบคุณสมบัติเหล่านี้เพราะพวกเขาจะอยู่ในไฟล์ที่ซ่อนที่สร้างขึ้นโดยโค๊ดเจน
ด้วยโซลูชันนี้นิยามคลาสของคุณจะถูกสร้างขึ้นโดยอัตโนมัติจากตัวแบบข้อมูลในแต่ละบิลด์ คุณไม่สามารถแม้แต่จะเห็นพวกเขา มันเป็นCore Data Magic ที่ดีและง่ายสำหรับผู้เริ่มต้น
โซลูชันที่ 3 - สำหรับแอพที่ใช้งานจริงส่วนใหญ่
แต่โซลูชัน 2 ไม่ดีถ้าคุณต้องการเพิ่มคุณสมบัติที่ไม่มีการจัดการ (Objective-C ไม่อนุญาตให้เพิ่มคุณสมบัติในหมวดหมู่และ Swift ไม่อนุญาตให้เพิ่มคุณสมบัติที่เก็บไว้ในส่วนขยาย) ดังนั้นในแอปที่ใช้งานจริงส่วนใหญ่คุณอาจต้องการไปครึ่งทางระหว่างโซลูชัน 1 และ 2 ...
- ปล่อยให้โมเดลข้อมูลของคุณอยู่ในรายการรวบรวมแหล่งที่มา
- ในแต่ละ Entity สารวัตรในรูปแบบข้อมูลของคุณตั้งโค๊ดเจนจะCategory / ขยาย
- ใน Project Navigator ให้ลบและทิ้งไฟล์Foo + CoreDataClass.mหรือ. swiftใด ๆและเพื่อลดความสับสนในอนาคตให้เปลี่ยนชื่อไฟล์Foo + CoreDataProperties.mหรือ. swiftเป็นFoo.mหรือ. swift
- ตรวจสอบให้แน่ใจว่าไฟล์Foo.mหรือ. swiftแต่ละไฟล์มีข้อกำหนดคลาสซึ่งคุณสามารถเพิ่มคุณสมบัติที่ไม่ได้รับการจัดการของคุณเองได้
(รับทราบถึงคำตอบโดย Positron คำตอบของฉันที่นี่อธิบายว่าทำไมคำตอบของ Positron (โซลูชัน 1 ของฉัน) ทำงานได้และเพิ่มโซลูชัน 2 และโซลูชัน 3)