Коллекция NSFetchRequests в Swift 3

У меня есть объект, который использует словарь ключевых путей для получения запросов. Каждый запрос на выборку представляет отдельный объект. Все это прекрасно и работает под Swift 2.3 и ниже. Однако, когда я пытаюсь преобразовать свой проект в Swift 3, у меня возникают проблемы с новыми дженериками для запросов на выборку. Запросы на выборку, как правило, имеют тип, который они возвращают, связанный с ними, но мой словарь должен иметь запросы на выборку, которые возвращают все виды типов. Когда я пытаюсь создать словарь типа [String:NSFetchRequest<NSManagedObject>] или [String:NSFetchRequest< NSFetchRequestResult >] с запросами на выборку, относящимися конкретно к типу NSFetchRequest<Message>. (Message является подклассом NSManagedObject) я получаю ошибку компилятора:

Не удается преобразовать значение типа «NSFetchRequest‹ Message >» в ожидаемый словарь

тип значения «NSFetchRequest»

Как преобразовать один запрос на выборку в более общий тип запроса на выборку?


person David Beck    schedule 29.06.2016    source источник
comment
Объявите словарную запись как AnyObject или используйте NSDictionary.   -  person Tom Harrington    schedule 29.06.2016
comment
Не могли бы вы поделиться здесь кодом Swift2, чтобы мы могли попытаться преобразовать его в Swift3   -  person    schedule 30.06.2016
comment
Использование более общего словаря будет работать ([String: NSPersistentStoreRequest] тоже будет работать), но тогда потребуется приведение при чтении из словаря. Но это заставило меня задуматься, а не могли бы вы преобразовать один тип NSFetchRequest в другой? Ты сможешь! fetchRequestA as! NSFetchRequest<NSManagedObject> работает. Это довольно неуклюже, но это работает.   -  person David Beck    schedule 30.06.2016


Ответы (1)


По-видимому, вы можете преобразовать один тип запроса на выборку в другой. Хотя это как-то неуклюже. Я не могу себе представить ситуацию, когда актерский состав потерпит неудачу. В ObjC вам даже не понадобится актерский состав.

class A: NSManagedObject {}
class B: NSManagedObject {}

let fetchRequestA = NSFetchRequest<A>()
let fetchRequestB = NSFetchRequest<B>()

let fetchRequests: [String:NSFetchRequest<NSManagedObject>] = [
    "a" : fetchRequestA as! NSFetchRequest<NSManagedObject>,
    "b" : fetchRequestB as! NSFetchRequest<NSManagedObject>,
]
person David Beck    schedule 30.06.2016