用于测试对象类型的通用 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
是否是 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
}
我想做的是验证 [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
只能引用 类,不能引用结构或枚举。 Int
和 String
是结构。如果你改变你的代码,就像我在上面所做的那样,采用 Any
,它也适用于结构。
如果没有此更改,您的原始版本似乎可以正常工作,但实际上发生的是互操作将您的 Int
转换为 NSNumber
,这有点迂回不会适应基于元类型的方法。
但真正的问题是,您认为您为什么需要这个? is
已经这样做了。
我正在尝试编写一个函数,它接受一个对象和一个类型作为参数,returns 一个布尔值,指示该对象是否属于给定类型。似乎没有 Type 类型,所以我不确定该怎么做。我能做的最好的是
func objectIsType<T>(object: AnyObject, someObjectOfType: T) -> Bool {
return object is T
}
所以我可以做 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
}
我想做的是验证 [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
只能引用 类,不能引用结构或枚举。 Int
和 String
是结构。如果你改变你的代码,就像我在上面所做的那样,采用 Any
,它也适用于结构。
如果没有此更改,您的原始版本似乎可以正常工作,但实际上发生的是互操作将您的 Int
转换为 NSNumber
,这有点迂回不会适应基于元类型的方法。
但真正的问题是,您认为您为什么需要这个? is
已经这样做了。