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
是一个Int
或objectIsType(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文档,但我仍然有点困惑.
如果您想提供类型作为参数而不是值,您可以执行以下操作:
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
只能引用类,不能引用结构或枚举。 Int
和String
是结构体。如果您像我上面那样更改代码以采用Any
,它也适用于结构。
看起来您的原始版本在没有这种更改的情况下也能工作,但实际上发生的是互操作将您的版本转换Int
为NSNumber
有点迂回的做事方式,并且不会适应基于元类型的方法。
但问题确实是,你为什么认为你需要这个? is
已经做到了这一点。
归档时间: |
|
查看次数: |
1128 次 |
最近记录: |