오류 메시지가 핵심 데이터 파일을 참조하는 경우이 답변을 읽으십시오
개요 : 자동 생성 및 수동 생성 Core Data 관리 객체 클래스 파일이있을 수 있습니다.
이 답변은 오류의 첫 번째 줄이 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 's에 묻힌 파일입니다 DerivedData
. 이 파일은 데이터 모델 ( ) 파일이 대상의 컴파일 소스 빌드 단계에 포함 된 경우 모든 빌드 중에 Xcode에 의해 자동으로 생성됩니다 . 이 기능은 Xcode 9 정도에 추가되었습니다. Codegen 팝업 의 설정에 따라 각 엔티티 / 클래스마다 하나 또는 두 개의 파일이 생성됩니다 . 데이터 모델 을 편집하는 동안 엔터티를 선택하면 해당 팝업이 데이터 모델 관리자 에 있습니다..xcdatamodeld
설정은 다음과 같습니다
- 수동 / 없음 파일이 생성 되지 않습니다
- 카테고리 / 확장 Objective-C 카테고리 또는 Swift 확장자를 포함하는 Foo + CoreDataProperties.m 또는 .swift 파일 하나 가 생성됩니다.
- 클래스 정의 동일한 Category / Extension 파일이 생성되고 클래스 선언 및 정의가 포함 된 Foo + CoreDataClass.m 또는 .swift 가 생성됩니다.
따라서 이전 Xcode에 익숙한 개발자 (예 : 나와 같은)가 새로운 Xcode에서 프로젝트를 시작할 때 문제가 발생합니다. Codegen 팝업 의 설정으로 인해 Xcode가 중복 파일을 생성 한다는 것을 인식하지 못하고 Project Navigator에서 볼 수있는 파일을 생성하려면 Managed Object Subclass 생성 메뉴 항목 을 사용해야한다고 생각합니다. "네비게이터"는 프로젝트 네비게이터에 표시되지 않습니다. 개발자가 헤더의 주석 을 읽고 주의 하는 것을 신뢰하지 않기 때문 입니다. //이 파일은 자동으로 생성되어 편집해서는 안됩니다.
해결 방법 1-이전 방식 사용
하나의 설정만으로 데이터 모델에 대해 모든 자동 Codegen 을 비활성화 할 수 있습니다 .
- 문제 대상의 오픈 빌드 페이즈 (에서 프로젝트 네비게이터 를 선택 프로젝트는 다음의 목록에 TARGETS 나타난 후, 탭 문제의 대상을 선택 빌드 페이즈 ).
- 확장 컴파일 소스 항목을하고 문제 데이터 모델 (찾을
.xcdatamodeld
파일).
- 컴파일리스트에서 삭제
- 데이터 모델이 번들 자원 복사 목록에 포함되어 있는지 확인하십시오 .
솔루션 2-초보자를위한 핵심 데이터 매직
여기, 당신은 더 새로운 길로 들어갑니다.
- 해당 Compile Sources 에서와 같이 데이터 모델을 그대로 두십시오 .
- 데이터 모델의 각 엔티티 검사기에서 Codegen 을 클래스 정의로 설정하십시오 .
- 프로젝트 네비게이터에서 Foo + CoreDataClass 파일을 삭제하고 휴지통에 버리고 Foo + CoreDataProperties.m 또는 .swift 파일의 이름을 Foo + MyProperties 와 같이 바꾸십시오 .
- 각 Foo + MyProperties.m 또는 .swift 파일에서 Xcode에 의해 생성 된 속성이있는 경우 Codegen에 의해 생성 된 숨겨진 파일에 있으므로 이러한 속성을 삭제하십시오 .
이 솔루션을 사용하면 클래스 정의가 각 빌드의 데이터 모델에서 자동으로 생성됩니다. 당신은 심지어 그들을 볼 수 없습니다. 그것은이다 코어 데이터 매직 , 초보자를위한 좋은 간단한.
솔루션 3-대부분의 실제 앱
그러나 관리되지 않는 속성을 실제로 추가하려는 경우 솔루션 2는 좋지 않습니다. (Objective-C에서는 속성을 범주에 추가 할 수 없으며 Swift에서는 저장된 속성을 확장에 추가 할 수 없습니다.) 따라서 대부분의 실제 응용 프로그램에서는 솔루션 1과 2 사이의 중간 지점을 원할 것입니다.
- 데이터 소스 를 컴파일 소스 목록에 두십시오.
- 데이터 모델의 각 엔티티 검사기에서 Codegen 을 Category / Extension으로 설정하십시오 .
- 프로젝트 네비게이터에서 Foo + CoreDataClass.m 또는 .swift 파일을 삭제하고 휴지통에 넣은 후 나중에 혼동을 줄이려면 Foo + CoreDataProperties.m 또는 .swift 파일의 이름을 Foo.m 또는 .swift로 바꾸십시오 .
- 각 Foo.m 또는 .swift 파일에 자체 정의 된 비 관리 속성을 추가 할 수있는 클래스 정의가 포함되어 있는지 확인하십시오 .
(Positron의 답변에 대한 감사의 말. 여기의 대답은 Positron의 답변 (내 솔루션 1)이 작동하는 이유를 설명하고 솔루션 2 및 솔루션 3을 추가합니다.)