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

mwa*_*way 6 generics types ios swift

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

func objectIsType<T>(object: AnyObject, someObjectOfType: T) -> Bool {
    return object is T
}
Run Code Online (Sandbox Code Playgroud)

所以我可以做objectIsType(x, 5),测试是否x是一个IntobjectIsType(x, "hi")看看它是否是一个字符串,但我希望能够打电话objectIsType(x, Int)来看看是否x是一个Int, objectIsType(x, String)看看它是否是一个String.这样的事情可能吗?

编辑:

Airspeed Velocity改进了我的功能,并对它完成is已经做的事情提出了很好的观点.新功能是这样的:

func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool {
    return object is T
}
Run Code Online (Sandbox Code Playgroud)

我要做的是验证[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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Air*_*ity 3

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

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

let a: Any = 1

objectIsType(a, Int.self)  // returns true
Run Code Online (Sandbox Code Playgroud)

注意,AnyObject只能引用类,不能引用结构或枚举。 IntString是结构体。如果您像我上面那样更改代码以采用Any,它也适用于结构。

看起来您的原始版本在没有这种更改的情况下也能工作,但实际上发生的是互操作将您的版本转换IntNSNumber有点迂回的做事方式,并且不会适应基于元类型的方法。

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