ios - 如何在 Swift 中转换为泛型类型

标签 ios xcode swift generics casting

我即将学习 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/

相关文章:

ios - 应用商店验证阶段包标识符错误

ios - iPhone 6 和 6 Plus 的平台字符串是什么?

ios - 将 JSON 解析为 tableview

c++ - 延迟加载 Dylib

ios - 如何在 SwiftUI 中切换泛型@ObservedObject?

ios - 以编程方式创建 UIButton 时启用色调颜色更改动画

ios - 如何拒绝来自 iTunes 商店的二进制文件(新的 iTunes Connect 网站)

iphone - XCode 4.2 安装错误

ios - Xcode忘记密码解析

ios - 增加 SwiftUI 中选项卡栏项目图标的大小