可以在Swift中创建泛型类型检查功能吗?

本·男爵

我向继承的Web API框架中添加了更好的错误处理。目前,它会进行大量强制转换,一旦数据与预期不符,就会导致崩溃。

我想as!用一个检查类型并在失败时引发异常(带有详细描述)的函数替换所有对的使用

到目前为止,这是我要做的:

func checkType<T>(type: AnyClass, value: T?, name: String) throws -> T {
    guard let value = value else {
        let message = "[\(name)] Expected \(type), but value was nil"
        throw PlaidsterError.InvalidType(message)
    }

    guard value.dynamicType.self == type else {
        let message = "[\(name)] Expected \(type), but it was an \(value.dynamicType.self) with value: \(value)"
        throw PlaidsterError.InvalidType(message)
    }

    return value
}

但这有多个问题。它只能接受对象类型,如果类不完全匹配则失败(例如,NSString失败,因为它实际上是__NSCFString),并且它不能与任何类型(即String,Int,Double ...)一起使用。

我似乎无法找到的代名词AnyClassAny值类型,这是第一个问题。而且似乎不可能做类似的事情,value.dynamicType.self is type因为它说那type不是一种类型。


有可能做我想做的事吗?有没有更好的方法来进行这种类型检查,而不会在分析代码中散布大量的样板代码?

我的目标是得到像这样甚至更简单的东西:

public struct PlaidCategory {

    // MARK: Properties
    public let id: String
    public let hierarchy: [String]
    public let type: String

    // MARK: Initialization
    public init(category: [String: Any]) throws {
        id = try checkType(String.self, value: category["id"], name: "id")
        hierarchy = try checkType([String].self, value: category["hierarchy"], name: "hierarchy")
        type = try checkType(String.self, value: category["type"], name: "type")
}

}

OOPer

您可以使用另一个泛型类型参数编写类似的内容。

func checkType<T, U>(type: U.Type, value: T?, name: String) throws -> U {
    guard let value = value else {
        let message = "[\(name)] Expected \(type), but value was nil"
        throw PlaidsterError.InvalidType(message)
    }

    guard let result = value as? U else {
        let message = "[\(name)] Expected \(type), but it was an \(value.dynamicType) with value: \(value)"
        throw PlaidsterError.InvalidType(message)
    }

    return result
}

并将其用作:

do {
    let n: Any = 3
    let t = try checkType(Int.self, value: n, name: "n")
    print(t) //->3
} catch let error {
    print(error)
}
do {
    let n: Any = "x"
    let t = try checkType(Int.self, value: n, name: "n")
    print(t)
} catch let error {
    print(error) //->InvalidType("[n] Expected Int, but it was an _NSContiguousString with value: x")
}

希望这对您有效PlaidCategory.init(category:),但未经测试。


多一个。如果仅在可推断返回类型的地方使用它,则无需传递type参数。

func checkType<T, U>(value: T?, name: String) throws -> U {
    guard let value = value else {
        let message = "[\(name)] Expected \(U.self), but value was nil"
        throw PlaidsterError.InvalidType(message)
    }

    guard let result = value as? U else {
        let message = "[\(name)] Expected \(U.self), but it was an \(value.dynamicType) with value: \(value)"
        throw PlaidsterError.InvalidType(message)
    }

    return result
}

并将其用作:

do {
    let n: Any = "x"
    let t: Int = try checkType(n, name: "n")
    print(t)
} catch let error {
    print(error) //->InvalidType("[n] Expected Int, but it was an String with value: x")
}

或者:

public struct PlaidCategory {

    // MARK: Properties
    public let id: String
    public let hierarchy: [String]
    public let type: String

    // MARK: Initialization
    public init(category: [String: Any]) throws {
        id = try checkType(category["id"], name: "id")
        hierarchy = try checkType(category["hierarchy"], name: "hierarchy")
        type = try checkType(category["type"], name: "type")
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以在kotlin数据类中创建泛型类型吗?

来自分类Dev

您可以在Swift中为特定的泛型类型添加协议扩展吗?

来自分类Dev

您可以在Swift中为特定的泛型类型添加协议扩展吗?

来自分类Dev

在Swift中声明函数的泛型类型符合“可以被乘”

来自分类Dev

检查泛型java中的引用类型

来自分类Dev

检查泛型的类型

来自分类Dev

泛型类型的功能

来自分类Dev

泛型类型的功能

来自分类Dev

在无形状的Scala中,可以将文字类型用作泛型类型参数吗?

来自分类Dev

当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

来自分类Dev

在DART中创建泛型类型的实例

来自分类Dev

在Scala中创建泛型类型的实例?

来自分类Dev

Swift中构造泛型类型的扩展

来自分类Dev

Swift中泛型的类型推断

来自分类Dev

Swift中类型T的泛型调用

来自分类Dev

Swift泛型:类型声明中的位置

来自分类Dev

Swift 中的多级泛型类型约束

来自分类常见问题

如何检查两个结构在Swift中是否具有相同的泛型参数类型?

来自分类Dev

如何检查两个结构在Swift中是否具有相同的泛型参数类型?

来自分类Dev

在Java中,可以指定任意数量的泛型类型参数吗?

来自分类Dev

我可以使Swift枚举泛型,所以我可以使用它的情况来为泛型类推断类型吗?

来自分类Dev

检查类中泛型类型是否为特定类型

来自分类Dev

如何检查Swift泛型类型是否为Void?

来自分类Dev

我可以确定泛型类型的零值吗?

来自分类Dev

泛型类型可以实现多个抽象类吗?

来自分类Dev

可以在泛型类型上调用VHDL image属性吗?

来自分类Dev

泛型身份函数可以推断元组类型吗?

来自分类Dev

如何在 Swift 4.2 中创建数据类型泛型

来自分类Dev

Scala检查泛型类型

Related 相关文章

  1. 1

    我可以在kotlin数据类中创建泛型类型吗?

  2. 2

    您可以在Swift中为特定的泛型类型添加协议扩展吗?

  3. 3

    您可以在Swift中为特定的泛型类型添加协议扩展吗?

  4. 4

    在Swift中声明函数的泛型类型符合“可以被乘”

  5. 5

    检查泛型java中的引用类型

  6. 6

    检查泛型的类型

  7. 7

    泛型类型的功能

  8. 8

    泛型类型的功能

  9. 9

    在无形状的Scala中,可以将文字类型用作泛型类型参数吗?

  10. 10

    当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

  11. 11

    在DART中创建泛型类型的实例

  12. 12

    在Scala中创建泛型类型的实例?

  13. 13

    Swift中构造泛型类型的扩展

  14. 14

    Swift中泛型的类型推断

  15. 15

    Swift中类型T的泛型调用

  16. 16

    Swift泛型:类型声明中的位置

  17. 17

    Swift 中的多级泛型类型约束

  18. 18

    如何检查两个结构在Swift中是否具有相同的泛型参数类型?

  19. 19

    如何检查两个结构在Swift中是否具有相同的泛型参数类型?

  20. 20

    在Java中,可以指定任意数量的泛型类型参数吗?

  21. 21

    我可以使Swift枚举泛型,所以我可以使用它的情况来为泛型类推断类型吗?

  22. 22

    检查类中泛型类型是否为特定类型

  23. 23

    如何检查Swift泛型类型是否为Void?

  24. 24

    我可以确定泛型类型的零值吗?

  25. 25

    泛型类型可以实现多个抽象类吗?

  26. 26

    可以在泛型类型上调用VHDL image属性吗?

  27. 27

    泛型身份函数可以推断元组类型吗?

  28. 28

    如何在 Swift 4.2 中创建数据类型泛型

  29. 29

    Scala检查泛型类型

热门标签

归档