2016-07-30 3 views
2

Я переношу свой код на Swift 3, и я столкнулся с проблемой, о которой я не уверен на 100%.Расширение протоколов, соответствующих NSFetchRequestResult

Начиная с WWDC 2016 команда Core Data обновила свою фреймворк, чтобы быть более дружественной к дженерикам, а новая усиленная до NSFetchRequest теперь возвращает объекты, соответствующие NSFetchRequestResult.

Так в коде ниже у меня есть базовый протокол, который соответствует указанному NSFetchRequestResult протокола, а также в расширении своего ребенка протокола ManagedObjectFetchable Я хочу вернуть выборки объектов соответствующих типов:

import CoreData 

@objc protocol ManagedObjectType: class, NSFetchRequestResult { } 

protocol ManagedObjectFetchable: ManagedObjectType { } 

extension ManagedObjectFetchable { 
    static func preFetch(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [Self] { 
    let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName) 
    fetchRequest.predicate = predicate 
    fetchRequest.sortDescriptors = sortDescriptors 

    let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) 
    return try dummyContext.fetch(fetchRequest) 
    } 
} 

Проблема вот эта строка:

// Error: Binary operator '<' cannot be applied to operands of type 'NSFetchRequest<_>.Type' and 'Self.Type' 
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName) 

это немного сбивает с толку, потому что я не думаю, что это не имеет ничего общего с бинарными операторами ... Перед тем, как перейти к слишком простой вывод, что это ошибка Swift I было интересно, yone столкнулся с аналогичными проблемами.


Я могу обойти эту проблему с помощью дженериков:

extension ManagedObjectFetchable { 
    static func preFetch<T: ManagedObjectFetchable>(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [T] { 
    let fetchRequest = NSFetchRequest<T>(entityName: Self.entityName) 
    fetchRequest.predicate = predicate 
    fetchRequest.sortDescriptors = sortDescriptors 

    let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) 
    return try dummyContext.fetch(fetchRequest) 
    } 
} 

Это то, что я собираюсь с сейчас, но мне не нравится, не понимая, почему это не будет работать. Если бы кто-нибудь мог помочь просветить эту проблему, это было бы потрясающе!

ответ

1

Это ошибка в Свифт. Изменение:

let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName) 

к:

let fetchRequest: NSFetchRequest<Self> = NSFetchRequest(entityName: Self.entityName) 

и код компилируется.

+1

Фантастический! Спасибо, Джек, я не думал об этом обходном пути. Я подал для этого радар: https://openradar.appspot.com/radar?id=6083573912174592 – Jad

Смежные вопросы