【发布时间】: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 -
也许,您应该将您的编辑作为另一个问题发布。