用于测试对象类型的通用 Swift 函数

Posted

技术标签:

【中文标题】用于测试对象类型的通用 Swift 函数【英文标题】:Generic Swift function to test for object type 【发布时间】:2015-05-14 22:17:31 【问题描述】:

我正在尝试编写一个函数,该函数接受一个对象和一个类型作为参数,并返回一个布尔值,指示该对象是否属于给定类型。似乎没有 Type 类型,所以我不确定如何执行此操作。我能做的最好的就是

func objectIsType<T>(object: AnyObject, someObjectOfType: T) -> Bool 
    return object is T

所以我可以使用objectIsType(x, 5) 来测试xInt 还是objectIsType(x, "hi") 以查看它是否是字符串,但我希望能够调用objectIsType(x, Int) 以查看@ 987654327@ 是 IntobjectIsType(x, String),看看它是否是 String。这样的事情可能吗?

编辑:

Airspeed Velocity 改进了我的功能,并指出它完全符合is 的功能。新功能是这样的:

func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool 
    return object is T

我要做的是验证[String: Any] 字典的值是否属于我期望的类型。例如:

let validator: [String: Any.Type] = [
    "gimme an int": Int.self,
    "this better be a string": String.self
]

let validatee: [String: Any] = [
    "gimme an int": 3,
    "this better be a string": "it is!"
]

for (key, type) in validator 
    if !objectIsType(validatee[key], type) 
        selfDestruct()
    

但我收到了错误消息,&lt;&gt;protocol.Type is not convertible to T.type。我查看了 Metatype 文档,但我仍然有点困惑。

【问题讨论】:

在这里使用AnyObject 很危险。 x 将从 Int 转换为 NSNumber 所以 objectIsType(5 as Int, 5 as Double) == true 也许,您应该将您的编辑作为另一个问题发布。 【参考方案1】:

如果您想提供一个类型作为参数,而不是一个值,您可以执行以下操作:

func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool 
    return object is T


let a: Any = 1

objectIsType(a, Int.self)  // returns true

注意,AnyObject 只能引用类,不能引用结构或枚举。 IntString 是结构体。如果你像我上面所说的那样改变你的代码来获取Any,它也适用于结构。

看起来你原来的工作没有这个改变,但实际上发生的是互操作将你的Int转换为NSNumber,这是一种迂回的做事方式,不会适应到基于元类型的方法。

但问题是,你认为你为什么需要这个? is 已经做到了这一点。

【讨论】:

感谢@Airspeed!很想听听关于我的编辑的任何想法。

以上是关于用于测试对象类型的通用 Swift 函数的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 扩展限制为一个类型

TypeScript 类型推断 - 函数的通用对象

Android:如何使 Kotlin 中所有对象列表的类型转换器(用于 Room)通用

init 函数中的 Swift 嵌套类型

Swift - 将类型动态传递给 JSONDecoder

打字稿:如何制作接受对象的类型,其键匹配通用但所有值都是值参数的映射函数