用于测试对象类型的通用 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)
来测试x
是Int
还是objectIsType(x, "hi")
以查看它是否是字符串,但我希望能够调用objectIsType(x, Int)
以查看@ 987654327@ 是 Int
和 objectIsType(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()
但我收到了错误消息,<>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
只能引用类,不能引用结构或枚举。 Int
和 String
是结构体。如果你像我上面所说的那样改变你的代码来获取Any
,它也适用于结构。
看起来你原来的工作没有这个改变,但实际上发生的是互操作将你的Int
转换为NSNumber
,这是一种迂回的做事方式,不会适应到基于元类型的方法。
但问题是,你认为你为什么需要这个? is
已经做到了这一点。
【讨论】:
感谢@Airspeed!很想听听关于我的编辑的任何想法。以上是关于用于测试对象类型的通用 Swift 函数的主要内容,如果未能解决你的问题,请参考以下文章