通用Swift函数来测试对象类型
我正在尝试编写一个函数,它将一个对象和一个类型作为参数,并返回一个布尔值,指示该对象是否属于给定类型。 似乎没有Type类型,所以我不知道如何做到这一点。 我能做的最好的是
func objectIsType(object: AnyObject, someObjectOfType: T) -> Bool { return object is T }
所以我可以做objectIsType(x, 5)
,来测试x
是Int
还是objectIsType(x, "hi")
,看看它是否是一个字符串,但我希望能够调用objectIsType(x, Int)
查看x
是否为Int
和objectIsType(x, String)
以查看它是否为String
。 这样的事情可能吗?
编辑:
Airspeed Velocity改进了我的function,并为它做了一件非常重要的事情。 新function是这样的:
func objectIsType(object: Any, someObjectOfType: T.Type) -> Bool { return object is T }
我要做的是validation[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文档,但我仍然有点困惑。
如果要提供类型作为参数而不是值,则可以执行以下操作:
func objectIsType(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
,这是一种迂回的做事方式,不会适应基于元类型的方法。
但问题是,为什么你认为你需要这个? 已经做到了这一点。