簡體   English   中英

如何在Swift中轉換為泛型類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM