Подтвердить что ты не робот

Xcode-бета 8. Невозможно создать основные данные

Я пытаюсь добавить основные данные. И каждый раз, когда я получал ту же ошибку:

error: filename "EntityName +CoreDataClass.swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.swift'

Я добавляю основные данные, используя следующие шаги:
1.Новый файл /DataModel; сохранить его в корневом каталоге моего проекта
выберите Model.xcdatamodeld и добавьте объект, добавьте несколько атрибутов, сохраните, редактор/создать подкласс NSManagedObjectClass.

В результате я наблюдаю 4 новых файла в навигаторе: Model.xcdatamodeld, EntityName + CoreDataProperties.swift, EntityName + CoreDataClass.swift, _COREDATA_DATAMODELNAME _ + CoreDataModel.swift

их содержание: _COREDATA_DATAMODELNAME _ + CoreDataModel.swift:

import Foundation
import CoreData

___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___

EntityName + CoreDataClass.swift:

import Foundation
import CoreData


class EntityName: NSManagedObject {

}

EntityName + CoreDataProperties.swift:

import Foundation
import CoreData

extension EntityName {

    @nonobjc class func fetchRequest() -> NSFetchRequest< EntityName > {
        return NSFetchRequest< EntityName >(entityName: "EntityName");
    }

    @NSManaged var str: String?

}

Что я пробовал:
1. Очистить сборку, удалить DerivedData, удалить содержимое var/folders, перезагрузить
2. Удаление сгенерированных файлов, отображаемых в навигаторе

Все мои усилия были неудачными.
Что я делаю неправильно?

4b9b3361

Ответ 1

Xcode 8 включает автоматическое генерирование класса NSManagedObject, когда файл модели использует формат файла Xcode 8. Если вы создаете свои собственные файлы подкласса, вы создаете дубликаты. Второй файл в сообщении об ошибке в DerivedSources - это тот, который Xcode создан автоматически.

Если автоматически созданные файлы делают то, что вам нужно, просто перестаньте создавать свои собственные, и все будет в порядке.

Если вы хотите создать свои собственные подклассы, вы можете либо

  • Задайте "версию инструментов" для файла модели Xcode 7.3 или более ранней, чтобы отключить все генерирование кода (это, похоже, не изменяет ничего значимого в фактическом содержимом файла) или
  • Отключите автоматическую генерацию для каждого объекта отдельно, установив для параметра "Codegen" значение "Ручной/Нет" для объекта.

Ответ 2

В XCode 8 есть две ошибки:

1 - Если вы измените раскрывающийся список Codegen, новое значение не будет сохранено в Model.xcdatamodel. Вы должны изменить что-то еще, чтобы сохранить его. Например, измените имя класса; строить; измените имя класса назад; строить снова.

2 - Сгенерированный код помещается в DerivedData в папку Intermediates, но это происходит только в том случае, если папка еще не существует. Обходной путь состоит в том, чтобы сделать чистую, а затем сборку.

Ответ 3

У меня есть такая же проблема (с помощью Swift), и я подозреваю, что это ошибка. Если я правильно понимаю, OP использует подклассы Xode autogen NSManagedObject и впоследствии не создает дополнительные (лишние) подклассы, которые, как представляется, являются источником некоторой путаницы.

Шаги для воспроизведения:

  • Создайте новый проект, приложение с одним представлением. Отметьте "Использовать основные данные"

  • Создайте объект в объекте модели, добавьте свойства, убедитесь, что файл   (иногда Xcode 8 Beta выдает данные, если не явно   сохранены)

  • Выбрать редактор → Создан подкласс NSManagedObject. Пометить   ящики

Xcode создает 3 файла:

  • COREDATA_DATAMODELNAME _ + CoreDataModel.swift. Этот файл поврежден и содержит недействительные записи, следующие за import Foundation и CoreData - проект не будет компилироваться, если только этот файл удален

    import Foundation
    
    import CoreData
    
    ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
    
  • EntityName + CoreDataClass.swift

  • EntityName + CoreDataProperties.swift

Хотя редактор не отмечает никаких ошибок на этом этапе, пытается скомпилировать сбой по причинам, указанным OP (а именно, отсутствующие файлы с одинаковыми именами, но с префиксом "." в папке DerivedData)

Если вы создаете подклассы NSManagedObject вручную после создания вашей модели без использования Xcode, очевидно, прослушиваемого автогенератора, проблем нет. Немного больше набрав, но намного надежнее! Однако вам нужно будет начать с "чистого" проекта (т.е. До того, как вы попытаетесь автоматически сгенерировать подклассы), в противном случае ошибка сохранится. Очистка исходных данных не поможет печально.

***** ОБНОВЛЕНО ***** Кажется, что что-то происходит довольно странно, и, как представляется, изначально предлагалось (извинения), как представляется, беззвучное генерирование кода, но это очень отличается от того, чего можно было бы ожидать. Кроме того, этот код не отображается в редакторе (что кажется немного бессмысленным, а также запутанным). Он создается в подпапках DerivedData > Build > Intermediates > .Build.

Я могу полностью понять, почему OP был смущен (как и я!). То, что стоит эта функция, несомненно, является попыткой быть полезной, но несколько запутанной, если вы привыкли к предыдущему поведению, и вам предлагают возможность генерировать видимый и редактируемый дубликат из главного меню.

Итак, выберите "Ручной/Нет" в окне Codegen (показано ниже), а затем вы можете использовать опцию автогенера в строке меню (после удаления "мусора" ) или написать свой собственный код.

Новый вариант кода XCode 8

Ответ 4

Выполните следующие шаги,

  • Отключите автоматическую генерацию для каждого объекта отдельно, установив параметр "Кодек" для "Ручной/Нет" для объекта.

  • Измените имя объекта на что-то еще, чтобы его сохранить. Например изменить имя класса; строить; измените имя класса назад; строить еще раз.

Ответ 5

Я получил эту ошибку,

просто измените версию инструмента на Xcode 7.3 в файле .xcdatamodeld

и он отлично работает!

Ответ 6

Для всех, у кого возникают проблемы с работой автогена:

Мне нужно было установить "com.apple.syncservices.Syncable" в "NO" в настройках пользовательской информации для Entity.

Возможно, это помогает.

Ответ 7

Том Харрингтон Ответ правильный. Тем не менее, есть способ добавить свои собственные функции и/или vars, не выполняя ни одного из двух указанных вариантов.

Просто создайте расширение для класса. (убедитесь, что вы назвали swift файл чем-то отличным от стандартных файлов сгенерированных NSManagesObject.)

Например. Если у вас есть объект под названием MyEntity, вы можете добавить быстрый файл с именем MyEntityExtension.swift, который может выглядеть примерно так:

import Foundation
import CoreData
import UIKit


extension MyEntity {

    var color: UIColor {
        get {
            return self.colorValue as! UIColor
        }
        set {
            if newValue.isMember(of: UIColor.self) {
                self.colorValue = newValue
            }
        }
    }

}

Ответ 8

Попробовав несколько опубликованных ответов, перезагрузка моей машины работала для меня.

Ответ 9

Удалите данные ядра файла компиляции во вкладке "Этапы сборки", нажмите "Исходный код" -