это не совместимо с версией ios 9, пожалуйста, предложите сделать его совместимым, пока он вообще не будет полезен.

аюсь преобразовать мой код запроса выборки из базовых данных в общий тип.

let request = NSPredicate(format: "name == %@ AND password == %@ AND type == %@", "admin", "admin", "admin")
let fetchReq : NSFetchRequest = UserRegistration.fetchRequest()
fetchReq.predicate = request
let adminDetail :[UserRegistration] = DatabaseEngine.fetch(fetchRequest: fetchReq)!

Преобразовано до сих пор:

extension UIViewController{
    class func getData<T: NSManagedObject>(req: NSPredicate) -> T{
        let fetchReq : NSFetchRequest = T.fetchRequest()
        fetchReq.predicate = req
        return DatabaseEngine.fetch(fetchRequest: fetchReq as! NSFetchRequest<NSManagedObject>)! as! T

    }
}

Функция DatabaseEngine.fetch.

static func fetch (fetchRequest: NSFetchRequest<T> = NSFetchRequest(), context:NSManagedObjectContext = kApplicationDelegate.managedObjectContext) -> [T]? {

    let entity =  NSEntityDescription.entity(forEntityName: typeName(some:T.self)
        , in:context)
    // Configure Fetch Request
    fetchRequest.entity = entity
    do {
        return try  context.fetch(fetchRequest as! NSFetchRequest<NSFetchRequestResult>) as? [T]
    } catch {

        //let fetchError = error as NSError
        // return nil

    }
    return nil
}

Но результатов больше нет. Кто-нибудь поможет мне преобразовать этот код с несколькими поясняющими строками. Ответ будет оценен наверняка.

 Dávid Pásztor04 сент. 2017 г., 15:16
Почему бы вам реализовать эту функцию как расширениеUIViewController? Кроме того, ваши типы, кажется, не соответствуют. В вашей первой реализации,DatabaseEngine.fetch возвращает массив, в то время как в вашей универсальной реализации он возвращает один объект. Однако, не видя реализацииDatabaseEngine.fetchТрудно сказать что-то определенное.
 Dávid Pásztor04 сент. 2017 г., 15:25
Тогда просто сделайте тип возврата[T], Однако, как я уже сказал, не видя определенияDatabaseEngine.fetchЯ не могу дать точный ответ. Кстати, принудительное развертывание возвращаемого значения и приведение к силе кажутся плохими идеями для функции, если вы не уверены на 100%, результат никогда не будетnil (в этом случае определение функции для возврата необязательного значения не имеет смысла).
 vadian04 сент. 2017 г., 15:47
Базовые данные уже достаточно общие. Вместо того, чтобы делать общее более общее, я рекомендую протокол и расширение протокола (не связанные сUIViewController) ограниченNSManagedObject со статическими методами, которые всеNSManagedObject Подклассы могут принять. И вы делаете умную обработку ошибок (throwошибки и возвращение не необязательных объектов при успехе) хуже, превращая ошибки в необязательные. СделатьgetData может бросить и пройти через брошенную ошибку.
 vaibhav04 сент. 2017 г., 15:28
@ DávidPásztor, см. Функцию DatabaseEngine.fetch.
 vaibhav04 сент. 2017 г., 15:22
@ DávidPásztor, да, он вернет массив точно, пожалуйста, сообщите, если вы можете изменить это расширение и его тип, что это может быть.

Ответы на вопрос(1)

Решение Вопроса

ением, например

protocol Fetchable
{
    associatedtype FetchableType: NSManagedObject = Self

    static var entityName : String { get }
    static var managedObjectContext : NSManagedObjectContext { get }
    static func objects(for predicate: NSPredicate?) throws -> [FetchableType]
}

extension Fetchable where Self : NSManagedObject, FetchableType == Self
{
    static var entityName : String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

    static var managedObjectContext : NSManagedObjectContext {
        return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    }

    static func objects(for predicate: NSPredicate?) throws -> [FetchableType]
    {
        let request = NSFetchRequest<FetchableType>(entityName: entityName)
        request.predicate = predicate
        return try managedObjectContext.fetch(request)
    }
}

+ Изменить(UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext на ссылку на контекст вашего управляемого объекта.

Сделать всеNSManagedObject подклассы принимаютFetchable, В подклассах не требуется никакого дополнительного кода.

Теперь вы можете получить данные с

do {
   let predicate = NSPredicate(format: ...
   let objects = try MyEntity.objects(for: predicate)
} catch {
    print(error)
}

Вот и все,objects находятся[MyEntity] без приведения типов и всегда не является обязательным при успехе.

Протокол легко расширяется по умолчанию дескрипторами сортировки, направлениями сортировки и т. Д.

 vadian05 сент. 2017 г., 08:15
Боже мой, это была опечатка в декларации (mnaged без). Исправлена.
 vaibhav03 нояб. 2017 г., 14:16
это не совместимо с версией ios 9, пожалуйста, предложите сделать его совместимым, пока он вообще не будет полезен.
 vaibhav05 сент. 2017 г., 07:51
получать ошибкуdoes not confirm to protocol когда я пытался усыновитьFetchable протокол к классу сущностей.
 vaibhav05 сент. 2017 г., 08:26
Да, я получил это и еще один, я исправил, спасибо так или иначе :)
 vaibhav05 сент. 2017 г., 07:03
Vadian, спасибо за ответ и объяснение, это здорово.

Ваш ответ на вопрос