我即将学习 Swift。我想编写一个类,为我处理 Cora 数据任务。在这种情况下,应该可以将实体名称和元组数组传递给一个函数,然后该函数将元组解释为 NSPredicate 的键值对以检索与它们匹配的 ManagedObjects。由于 NSPredicate 需要具有特定类型的值,因此我也尝试传递值的类型。但我无法解决“'t'不是类型”编译错误(最后一行代码)。如何将值转换为传递的类型?或者您会以完全不同的方式创建 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
。但是你会遇到问题,因为 NSPredicate 不采用类型 T - 因此解决方案并不是真正使用泛型,而是使用类似上面的东西。还值得牢记的是,避免使用诸如 .type 和 .value 之类的变量名是个好主意,因为在某些情况下这些会导致混淆,尤其是 NSManagedObjects(具有 .value)。至少值得知道这可能是问题的原因......
关于ios - 如何在 Swift 中转换为泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091664/