В Swift 2 работал следующий код:
let request = NSFetchRequest(entityName: String)
но в Swift 3 это дает ошибку:
Общий параметр ResultType не может быть выведен
потому что NSFetchRequest
теперь это общий тип. В своих документах они написали следующее:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
Итак, если мой класс результатов, например, Level
как мне правильно запросить?
Потому что это не работает:
let request: NSFetchRequest<Level> = Level.fetchRequest
let request: NSFetchRequest<Level> = Level.fetchRequest()
let request = Level.fetchRequest()
Ответы:
или
в зависимости от того, какую версию вы хотите.
Вы должны указать универсальный тип, потому что в противном случае вызов метода будет неоднозначным.
Первая версия определена для
NSManagedObject
, вторая версия создается автоматически для каждого объекта с использованием расширения, например:Все дело в том, чтобы отказаться от использования строковых констант.
источник
Type 'Project Name' does not conform to protocol 'NSFetchRequestResult'
Я думаю, что у меня это получилось, сделав это:
по крайней мере, он сохраняет и загружает данные из базы данных.
Но кажется, что это неправильное решение, но пока оно работает.
источник
Самая простая структура, которая работает в версии 3.0, выглядит следующим образом:
где Тип объекта данных - Страна.
Однако при попытке создать Core Data BatchDeleteRequest я обнаружил, что это определение не работает, и, похоже, вам понадобится форма:
хотя предполагается, что форматы ManagedObject и FetchRequestResult эквивалентны.
источник
if #available(iOS 10.0) { ... }
условногоВот несколько общих методов CoreData, которые могут ответить на ваш вопрос:
Предполагая, что для Contact существует такая настройка NSManagedObject:
Эти методы можно использовать следующим образом:
источник
NSManagedObjectID
вместо этого. Итак, прежде чемcontext.delete(record)
добавлятьlet record = context.object(with: record.objectID)
и использовать этот объект записи для удаления.Это самый простой способ перейти на Swift 3.0, просто добавьте
<Country>
(проверено и отработано)
источник
У меня также был "ResultType", о котором нельзя было вывести ошибки. Они очистились, как только я перестроил модель данных, установив для каждого объекта Codegen значение «Определение класса». Я сделал краткую запись с пошаговыми инструкциями здесь:
Ищете четкое руководство по обновленному NSPersistentContainer в Xcode 8 с Swift 3
Под «перестроенной» я подразумеваю, что я создал новый файл модели с новыми записями и атрибутами. Немного утомительно, но это сработало!
источник
Пока что лучше всего для меня работало:
источник
У меня была такая же проблема, и я решил ее, выполнив следующие действия:
После этого мне пришлось удалить / переписать все вхождения fetchRequest, поскольку XCode, похоже, каким-то образом смешивается с версией, сгенерированной кодом.
HTH
источник
Swift 3.0 Это должно работать.
источник