正如Martin在评论中指出的那样,任何价值都可以转换为
AnyObject
在Swift中,因为Swift将值类型包装在不透明的
_SwiftValue
上课,演员们就会永远成功。不过,这是有办法的。
检查一个值是否为引用类型(没有这种隐式转换)的方法是检查其是否为
类型
is AnyObject.Type
,如下所示:
func printIsObject<T>(_: T) {
if T.self is AnyObject.Type {
print("Object")
} else {
print("Other")
}
}
class Foo {}
struct Bar {}
enum Quux { case q }
printIsObject(Foo()) // => Object
printIsObject(Bar()) // => Other
printIsObject(Quux.q) // => Other
请注意,检查类型是否正确至关重要
是任意对象。类型
不
is AnyObject
.
T.self
,表示值类型的对象本身就是一个对象,因此
是AnyObject
将永远成功。相反
是任意对象。类型
询问“这是否继承自
元类型
在所有对象中”,即“表示类型的该对象是否继承自表示所有对象类型的对象?"
编辑:
显然,我忘了斯威夫特包括
AnyClass
作为的同义词
AnyObject.Type
,因此检查可以简化为
is AnyClass
. 然而,将上述内容作为对其工作原理的略微扩展的解释。
要将其集成到缓存机制中,您需要检查传入的泛型类型,看看它是否
是任意对象。类型
,并且只有在
已经
一个物体,投射到
任何对象
要存储在弱盒中:
func cache<T>(id: Int, instance: T) {
if T.self is AnyObject.Type {
cache[id] = WeakBox(boxed: instance as AnyObject)
} else {
// Store in a different cache, or do whatever.
}
}