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

Generic Swift function to test for object type

我正在尝试编写一个函数,它接受一个对象和一个类型作为参数,returns 一个布尔值,指示该对象是否属于给定类型。似乎没有 Type 类型,所以我不确定该怎么做。我能做的最好的是

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

所以我可以做 objectIsType(x, 5),来测试 x 是否是 IntobjectIsType(x, "hi") 以查看它是否是一个字符串,但我想成为能够调用 objectIsType(x, Int) 来查看 x 是否是 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()
    }
}

但是我遇到了错误,<>protocol.Type is not convertible to T.type。我看过 Metatype 文档,但还是有点困惑。

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

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 已经这样做了。