为什么我需要转换这个通用返回值? [英] Why do I need to cast this generic return value?

查看:42
本文介绍了为什么我需要转换这个通用返回值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对这里的泛型感到困惑.static 关键字让我难以理解.

I'm confused about generics here. The static keyword is making it difficult for me to understand.

import CoreData

@objc(Performer)
public class Performer: NSManagedObject, Fetchable {

  @NSManaged public var dob: Date

  @NSManaged public var firstName: String

  @NSManaged public var lastName: String
}

protocol Fetchable {
  static func fetchAll<T: NSManagedObject>(withPredicate predicate: NSPredicate?, in context: NSManagedObjectContext) throws -> [T]
}

extension Fetchable {

  static func fetchAll<T: NSManagedObject>(withPredicate predicate: NSPredicate?, in context: NSManagedObjectContext) throws -> [T] {
    let entityName = String(describing: self)
    let request = NSFetchRequest<T>(entityName: entityName)
    request.predicate = predicate
    return try context.fetch(request)
  }
}

let performers: [NSManagedObject] = try! Performer.fetchAll(in: context)

//或

let performers: [Performer] = try! Performer.fetchAll(in: context) as! [Performer]

//或

这一行是我的问题的焦点,因为它抛出了一个错误.但是通过杀死 Xcode 并重新启动来修复它.

This line was focus of my question as it was throwing an error. But fixed it by killing Xcode and re-launching.

let performers: [Performer] = try! Performer.fetchAll(in: context)

推荐答案

编译器无法推断 fetchAll 的泛型类型,因为没有传递该类型的参数.这就是为什么必须对类型进行注释(而不是强制转换)的原因.

The compiler cannot infer the generic type of fetchAll<T: NSManagedObject> because there is no passed parameter with this type. This is the reason why the type must be annotated (not cast).

要返回正确的 NSManagedObject 子类,请使用 associatedtype 例如

To return the proper NSManagedObject subclass use an associatedtype for example

protocol Fetchable {
    associatedtype FetchableType: NSManagedObject = Self
    static var entityName : String { get }
    static func fetchAll(withPredicate predicate: NSPredicate? = nil, in context: NSManagedObjectContext) throws -> [FetchableType]
}

extension Fetchable where FetchableType == Self {

    static var entityName : String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

    static func fetchAll(withPredicate predicate: NSPredicate? = nil, in context: NSManagedObjectContext) throws -> [FetchableType] {
        let request = NSFetchRequest<FetchableType>(entityName: entityName)
        request.predicate = predicate
        return try context.fetch(request)
  }
}

现在这行返回 [Performer] 没有类型转换

Now this line returns [Performer] without a type cast

let performers = try! Performer.fetchAll(in: context)

这篇关于为什么我需要转换这个通用返回值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆