Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: David BeckОтветов: 1

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

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

тип значения "NSFetchRequest"

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

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

swiftcore-datansfetchrequestswift3

Ответы

Ответ 1 · David Beck

По-видимому, вы можете преобразовать один тип запроса на выборку в другой. Хотя это как-то неуклюже. Я не могу себе представить ситуацию, когда актерский состав потерпит неудачу. В 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>,
]

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы