我的目标是将从DB获取的结果返回到任何给定的类型(模型(。由于某种原因,我得到的错误是"使用未声明的类型'model'"。我在这里错过了什么?以及如何实现我的目标。
func fetchData<T>(entity:String, model: T)-> T? {
let request = NSFetchRequest<NSFetchRequestResult>(entityName:entity)
request.returnsObjectsAsFaults = false
do {
let result = try managedObjectContext.fetch(request)
if result.count > 0 {
return result as model // Point that gets the error
}
} catch {
print("Failed to retrive data")
}
return nil
}
不需要强制转换。
根据Joakim的回答,我建议使该方法更通用,并使用throw
将错误移交给调用者。
创建具有泛型类型的获取请求可以摆脱类型转换
func fetchData<T : NSFetchRequestResult>(entity:String, model: T.Type) throws -> [T] {
let request = NSFetchRequest<T>(entityName:entity)
request.returnsObjectsAsFaults = false
return try managedObjectContext.fetch(request)
}
并使用
do {
let result = try fetchData(entity: “Foo”, model: Foo.self)
print(result)
} catch {
print("Failed to retrive data")
}
在强制转换时,您希望使用as
而不是is
,并且要强制转换的类型是T
而不是model
,或者更确切地说,它是[T]
,因为它是一个数组,因此函数声明也需要修改
func fetchDsata<T>(entity:String, model: T.Type)-> [T]? {
let request = NSFetchRequest<NSFetchRequestResult>(entityName:entity)
request.returnsObjectsAsFaults = false
do {
let result = try managedObjectContext.fetch(request)
if result.count > 0 {
return result as? [T]
}
} catch {
print("Failed to retrive data")
}
return nil
}