泛型 Swift 函数用于测试对象类型

6
我想编写一个函数,它接受一个对象和一个类型作为参数,并返回一个布尔值,指示该对象是否属于给定的类型。似乎没有“Type”类型,因此我不确定如何执行此操作。我所能做到的最好的就是:
func objectIsType<T>(object: AnyObject, someObjectOfType: T) -> Bool {
    return object is T
}

我可以使用 objectIsType(x, 5) 来测试 x 是否为 Int,或者使用 objectIsType(x, "hi") 来查看是否为字符串,但我希望能够调用 objectIsType(x, Int) 来查看是否为 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。我已经查看了元类型文档,但我还是有点困惑。


2
在这里使用 AnyObject 是很危险的。x 将从 Int 转换为 NSNumber,因此 objectIsType(5 as Int, 5 as Double) == true - Brian Nickel
1
也许你应该将你的编辑作为另一个问题发布。 - rintaro
1个回答

3
如果您想将类型作为参数而不是值进行传递,可以执行以下操作:
func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool {
    return object is T
}

let a: Any = 1

objectIsType(a, Int.self)  // returns true

NB,AnyObject只能引用类,而不能引用结构体或枚举。 IntString是结构体。如果您像我上面那样更改代码以使用Any,则可以与结构体一起使用。

可能您觉得原始代码没有进行更改也可以工作,但实际上是互操作将您的Int转换为NSNumber,这是一种绕路的方式,并且无法适应基于元类型的方法。

但问题真正在于,您为什么认为需要这样做?is已经完全可以满足此需求。


谢谢@Airspeed!很想听听您对我的编辑的任何想法。 - mway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接