无法将类型'[T]'的值转换为预期的参数类型'[_]'

时间:2016-11-24 22:00:46

标签: swift

每次我尝试编译时,都会收到错误:

Cannot convert value of type '[T]' to expected argument type '[_]'

我不确定为什么会这种情况继续发生,我试图查找解决方案但却没有发现任何看起来有用的东西。 这是我的代码:

class FetchRequest <T: NSManagedObject>: NSFetchRequest<NSFetchRequestResult> {
        init(entity: NSEntityDescription) {
        super.init()
        self.entity = entity
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    typealias FetchResult = (success: Bool, objects: [T], error: NSError?)
    func fetch <T> (request: FetchRequest<T>,
                     context: NSManagedObjectContext) -> FetchResult {
        do {
         let results = try context.fetch(request)
            return FetchResult(true, results as! [T], nil)
        } catch let error as NSError {
         return (false, [], error)
        }
    }
}

编辑:

我在这一行得到错误:

return FetchResult(true, results as! [T], nil)

1 个答案:

答案 0 :(得分:4)

问题是您有两个名为T的通用占位符类型。一个在类范围,一个在方法范围。当您说results as! [T]时,您指的是方法范围内的T - 这与T中使用的类范围FetchResult无关} type-alias,它是fetch方法的返回类型。

因此,您只需重命名一个占位符,或者更好的是,从方法中消除看似多余的request:参数,而只需使用self

func fetch(inContext context: NSManagedObjectContext) -> FetchResult {
    do {
        let results = try context.fetch(self)
        return (true, results as! [T], nil)
    } catch let error as NSError {
        return (false, [], error)
    }
}

现在,您只需在要获取的fetch(inContext:)实例上调用FetchRequest即可。