[英]Cast to a generic class type in swift
我的目標是將從數據庫中獲取的結果返回到任何給定類型(模型)。 出於某種原因,我收到錯誤為“使用未聲明的類型'模型'”。 我在這里想念什么? 以及如何實現我的目標。
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
}
您想在轉換時使用as
而不是is
並且要轉換的類型是T
而不是model
,或者更確切地說是[T]
因為它是一個數組,所以 function 聲明也需要修改
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
}
沒必要投。
根據 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")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.