Leia esta resposta se a mensagem de erro referenciar arquivos de dados principais
Sinopse: Você pode ter arquivos de classe de objeto gerenciados Core Data gerados automaticamente e manualmente.
Esta resposta se aplica se a primeira linha do erro se referir a um arquivo Foo + CoreDataProperties.o ou Foo + CoreDataClass.o . Exemplo:
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
A causa raiz pode ser vista expandindo a seção Arquivos de origem Compile Swift da Transcrição de compilação. Por exemplo:
<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'
O primeiro arquivo mencionado existe um arquivo de origem no diretório do projeto, gerado por alguém selecionando seu modelo de dados no Navegador de Projeto e clicando no menu Editor > Criar Subclasse de Objeto Gerenciado . Esse recurso foi adicionado no Xcode 7 ou mais.
O segundo arquivo é um arquivo com o mesmo nome, mas que está oculto no Xcode DerivedData
. Esse arquivo é gerado automaticamente pelo Xcode durante todas as construções, se o arquivo de modelo de dados ( .xcdatamodeld
) for incluído na fase de construção das fontes de compilação do destino . Este recurso foi adicionado no Xcode 9 ou mais. Zero, um ou dois arquivos são gerados para cada entidade / classe, dependendo da configuração do pop-up Codegen . Esse pop-up está no Data Model Inspector quando você seleciona uma entidade ao editar seu modelo de dados…
As configurações são:
- Manual / Nenhum Nenhum arquivo é gerado
- Categoria / Extensão Um arquivo, Foo + CoreDataProperties.m ou .swift é gerado, contendo uma categoria Objective-C ou extensão Swift.
- Definição de classe O mesmo arquivo de categoria / extensão é gerado e, além disso, um Foo + CoreDataClass.m ou .swift é gerado, contendo declaração e definição de classe.
Então você vê que o problema ocorre quando um desenvolvedor (como eu) acostumado ao Xcode mais antigo inicia um projeto em um Xcode mais recente. Achamos que precisamos usar o item de menu Criar subclasse de objeto gerenciado , o que fazemos, para criar os arquivos que podemos ver no Project Navigator sem perceber que nossas configurações no pop-up Codegen estão fazendo com que o Xcode crie arquivos duplicados, que a Apple "inteligentemente" não aparece no Project Navigator, porque eles não confiam nos desenvolvedores para ler e prestar atenção ao comentário no cabeçalho // Este arquivo foi gerado automaticamente e não deve ser editado.
Solução 1 - Use a maneira mais antiga
Você pode desativar todo o Codegen automático para um modelo de dados com apenas uma configuração:
- Abra o problema das fases de construção do alvo (no Project Navigator , selecione o projeto e, em seguida, na lista de TARGETS que aparece, selecione o destino do problema e, em seguida, marque a opção Build Fhases ).
- Expanda a entrada Fontes de Compilação e localize o modelo de dados do problema (
.xcdatamodeld
arquivo).
- Exclua-o da lista de compilação
- Verifique se o modelo de dados está incluído na lista Copiar recursos do pacote .
Solução 2 - Core Data Magic para iniciantes
Aqui, você entra no caminho mais recente.
- Deixe seu modelo de dados como está naquele Compile Sources .
- Em cada Inspetor de entidades em seu modelo de dados, defina Codegen como Definição de classe .
- No Project Navigator, exclua e lixeira todos os arquivos Foo + CoreDataClass e renomeie quaisquer arquivos Foo + CoreDataProperties.m ou .swift para algo como Foo + MyProperties .
- Em cada arquivo Foo + MyProperties.m ou .swift , se houver propriedades geradas pelo Xcode, exclua essas propriedades porque elas estarão nos arquivos ocultos criados pelo Codegen .
Com esta solução, suas definições de classe são geradas automaticamente a partir do modelo de dados em cada construção. Você nem pode vê-los. É Core Data Magic , agradável e simples para iniciantes.
Solução 3 - para a maioria dos aplicativos do mundo real
Mas a Solução 2 não é boa se você realmente deseja adicionar propriedades não gerenciadas. (O Objective-C não permite que propriedades sejam adicionadas em categorias e Swift não permite que propriedades armazenadas sejam adicionadas em extensões.) Portanto, na maioria dos aplicativos do mundo real, você provavelmente deseja ir a meio caminho entre as Soluções 1 e 2…
- Deixe seu modelo de dados na lista de fontes de compilação
- Em cada Inspetor de entidades em seu modelo de dados, defina Codegen como Categoria / extensão .
- No Project Navigator, exclua e lixeira todos os arquivos Foo + CoreDataClass.m ou .swift e, para reduzir futuras confusões, renomeie qualquer arquivo Foo + CoreDataProperties.m ou .swift para talvez apenas Foo.m ou .swift .
- Assegurar que cada Foo.m ou .swift arquivo contém a definição de classe, para o qual você pode adicionar suas próprias propriedades não de gestão.
(Agradecimentos à resposta da Positron. Minha resposta aqui explica por que a resposta da Positron (minha solução 1) funciona e adiciona a solução 2 e a solução 3.)