为什么我需要转换此通用返回值?

问题描述 投票:0回答:1

我对这里的仿制药感到困惑。 static关键字让我很难理解。

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并重新启动来修复它。

let performers: [Performer] = try! Performer.fetchAll(in: context)
swift syntax
1个回答
0
投票

编译器无法推断fetchAll<T: NSManagedObject>的泛型类型,因为此类型没有传递参数。这就是为什么必须注释类型(不是强制转换)的原因。

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

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 = NSFetchRequestFetchableType>(entityName: entityName)
        request.predicate = predicate
        return try context.fetch(request)
  }
}

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

let performers = try! Performer.fetchAll(in: context)
© www.soinside.com 2019 - 2024. All rights reserved.