W Swift 2 działał następujący kod:
let request = NSFetchRequest(entityName: String)
ale w Swift 3 daje błąd:
Nie można wywnioskować parametru ogólnego „ResultType”
ponieważ NSFetchRequest
jest teraz typem ogólnym. W swoich dokumentach napisali to:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
więc jeśli moja klasa wyników to na przykład Level
jak mam poprawnie zażądać?
Ponieważ to nie działa:
let request: NSFetchRequest<Level> = Level.fetchRequest
let request: NSFetchRequest<Level> = Level.fetchRequest()
let request = Level.fetchRequest()
Odpowiedzi:
lub
w zależności od wybranej wersji.
Musisz określić typ ogólny, ponieważ w przeciwnym razie wywołanie metody jest niejednoznaczne.
Pierwsza wersja jest definiowana dla
NSManagedObject
, druga wersja jest generowana automatycznie dla każdego obiektu wykorzystującego rozszerzenie, np .:Chodzi o to, aby usunąć użycie stałych typu String.
źródło
Type 'Project Name' does not conform to protocol 'NSFetchRequestResult'
Myślę, że udało mi się to, robiąc to:
przynajmniej zapisuje i ładuje dane z DataBase.
Ale wydaje się, że nie jest to właściwe rozwiązanie, ale na razie działa.
źródło
Najprostsza struktura, którą znalazłem, która działa w wersji 3.0, jest następująca:
gdzie Typ jednostki danych to Kraj.
Podczas próby utworzenia żądania danych podstawowych BatchDeleteRequest stwierdziłem jednak, że ta definicja nie działa i wydaje się, że będziesz musiał przejść z formularzem:
mimo że formaty ManagedObject i FetchRequestResult mają być równoważne.
źródło
if #available(iOS 10.0) { ... }
warunkuOto kilka ogólnych metod CoreData, które mogą odpowiedzieć na Twoje pytanie:
Zakładając, że istnieje konfiguracja NSManagedObject dla Contact w następujący sposób:
Metody te można wykorzystać w następujący sposób:
źródło
NSManagedObjectID
zamiast tego. Więc przedcontext.delete(record)
dodaniemlet record = context.object(with: record.objectID)
i użyciem tego obiektu rekordu do usunięcia.To najprostszy sposób migracji do Swift 3.0, wystarczy dodać
<Country>
(przetestowane i działające)
źródło
Miałem również „ResultType” nie można wywnioskować błędów. Wyjaśnili, kiedy przebudowałem model danych, ustawiając Codegen każdej jednostki na „Definicję klasy”. Zrobiłem krótki opis z instrukcjami krok po kroku tutaj:
Szukasz przejrzystego samouczka na temat poprawionego NSPersistentContainer w Xcode 8 z Swift 3
Przez „przebudowany” rozumiem, że utworzyłem nowy plik modelu z nowymi wpisami i atrybutami. Trochę żmudne, ale zadziałało!
źródło
Do tej pory najlepiej działało dla mnie:
źródło
Miałem ten sam problem i rozwiązałem go, wykonując następujące czynności:
Po wykonaniu tej czynności musiałem usunąć / przepisać wszystkie wystąpienia fetchRequest, ponieważ XCode wydaje się w jakiś sposób mieszać z wersją kodowaną.
HTH
źródło
Swift 3.0 To powinno działać.
źródło