En Swift 2 funcionaba el siguiente código:
let request = NSFetchRequest(entityName: String)
pero en Swift 3 da error:
No se pudo inferir el parámetro genérico "ResultType"
porque NSFetchRequest
ahora es un tipo genérico. En sus documentos escribieron esto:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
entonces, si mi clase de resultado es, por ejemplo, Level
¿cómo debo solicitar correctamente?
Porque esto no funciona:
let request: NSFetchRequest<Level> = Level.fetchRequest
let request: NSFetchRequest<Level> = Level.fetchRequest()
let request = Level.fetchRequest()
Respuestas:
o
dependiendo de la versión que desee.
Debe especificar el tipo genérico porque, de lo contrario, la llamada al método es ambigua.
La primera versión está definida para
NSManagedObject
, la segunda versión se genera automáticamente para cada objeto usando una extensión, por ejemplo:El objetivo es eliminar el uso de constantes de cadena.
fuente
Type 'Project Name' does not conform to protocol 'NSFetchRequestResult'
Creo que lo hice funcionar haciendo esto:
al menos guarda y carga datos de DataBase.
Pero parece que no es una solución adecuada, pero funciona por ahora.
fuente
La estructura más simple que encontré que funciona en 3.0 es la siguiente:
donde el tipo de entidad de datos es País.
Sin embargo, al intentar crear un BatchDeleteRequest de datos básicos, descubrí que esta definición no funciona y parece que deberá seguir el formulario:
aunque se supone que los formatos ManagedObject y FetchRequestResult son equivalentes.
fuente
if #available(iOS 10.0) { ... }
condicionalAquí hay algunos métodos CoreData genéricos que pueden responder a su pregunta:
Suponiendo que hay una configuración de NSManagedObject para Contact como esta:
Estos métodos se pueden utilizar de la siguiente manera:
fuente
NSManagedObjectID
. Entonces, antes decontext.delete(record)
agregarlet record = context.object(with: record.objectID)
y usar ese objeto de registro para eliminar.Esta es la forma más sencilla de migrar a Swift 3.0, solo agregue
<Country>
(probado y trabajado)
fuente
También tuve "ResultType" no se pudieron inferir errores. Se borraron una vez que reconstruí el modelo de datos estableciendo el Codegen de cada entidad en "Definición de clase". Hice una breve reseña con instrucciones paso a paso aquí:
Buscando un tutorial claro sobre el NSPersistentContainer revisado en Xcode 8 con Swift 3
Por "reconstruido" me refiero a que creé un nuevo archivo de modelo con nuevas entradas y atributos. Un poco tedioso, ¡pero funcionó!
fuente
Lo que funcionó mejor para mí hasta ahora fue:
fuente
Tuve el mismo problema y lo resolví con los siguientes pasos:
Después de hacer eso, tuve que eliminar / reescribir todas las apariciones de fetchRequest ya que XCode parece confundirse de alguna manera con la versión generada por código.
HTH
fuente
Swift 3.0 Esto debería funcionar.
fuente