[英]How to cast to generic type in Swift
我即將學習Swift。 我想編寫一個類,為我處理Cora Data任務。 在這種情況下,應該有可能將實體名稱和元組數組傳遞給一個函數,然后該函數將元組解釋為鍵值對,以便NSPredicates檢索與它們匹配的ManagedObjects。 由於NSPredicate需要具有特定類型的值,因此我也嘗試傳遞值的類型。 但是我無法解決“'不是'不是類型”的編譯錯誤(代碼的最后一行)。 如何將值轉換為傳遞的類型? 還是以完全不同的方式創建NSPredicate?
class func getManagedObjectsWithEntityName<T>(entityName: String, keysAndValues: [(key: String, value: AnyObject, type: T.Type)]) -> [NSManagedObject] {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: entityName)
var predicates: [NSPredicate] = []
for tuple in keysAndValues {
let t = tuple.type
predicates.append( NSPredicate(format: tuple.key + " = %@", tuple.value as t)!)
}
...
}
這里無需使用泛型,您似乎不必訪問用作泛型的任何類的成員/函數。
但是,您可以做的是選擇:可以采用符合CVarArgType的值,使您可以將其直接插入NSPredicate構造函數中,也可以將值作為字符串,並通過構建字符串表達式來構造謂詞。 這是使用CVarArgType的示例:
func getManagedObjectsWithEntityName(entityName: String, keysAndValues:
[(key: String, value: CVarArgType)]) -> [NSManagedObject] {
...
let fetchRequest = NSFetchRequest(entityName: entityName)
var predicates: [NSPredicate] = []
for tuple in keysAndValues {
predicates.append( NSPredicate(format: "%K = %@", tuple.key, tuple.value))
}
...
}
泛型不起作用的原因是您設置了一個占位符,但是函數sig中的tuple.type實際上是T.Type(而不只是T)。 如果將元組規范更改為(key: String, value: AnyObject, type: T)
則可以將let t = tuple.type as! T
let t = tuple.type as! T
。 但是然后您會遇到問題,因為NSPredicate沒有采用T類型-那里的解決方案不是真正使用泛型,而是使用類似上面的內容。 還應記住,避免使用諸如.type和.value之類的變量名是個好主意,因為在某些情況下,它們會引起事物的混淆,尤其是與NSManagedObjects(具有.value的事物)。 至少值得知道這可能是問題的原因...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.