Swift 如何测试泛型变量是否为AnyObject类型
在Swift 3中,我无法再检查泛型变量类型是否为class(Swift 如何测试泛型变量是否为AnyObject类型,swift,swift3,Swift,Swift3,在Swift 3中,我无法再检查泛型变量类型是否为class(AnyObject)。以下代码返回isObject的true,即使特定类型T和传递的值是struct而不是class。在Swift 2.3和2.2中,它按预期工作,isObject为false struct Foo<T> { var value: Any? var isObject: Bool = false init (val: T?) { if val != nil
AnyObject
)。以下代码返回isObject
的true
,即使特定类型T
和传递的值是struct而不是class。在Swift 2.3和2.2中,它按预期工作,isObject
为false
struct Foo<T>
{
var value: Any?
var isObject: Bool = false
init (val: T?)
{
if val != nil
{
// following line shows warnings in Swift 3
// conditional cast from 'T?' to 'AnyObject' always succeeds
// 'is' cast is always true
isObject = val is AnyObject
self.value = val
}
}
}
struct Bar
{
var bar = 0
}
let b = Foo<Bar>(val: Bar())
print(b.isObject) // -> true
structfoo
{
var值:有吗?
变量isObject:Bool=false
初始值(val:T?)
{
如果val!=nil
{
//下一行显示Swift 3中的警告
//从“T”到“AnyObject”的条件强制转换始终成功
//“是”的演员阵容总是正确的
isObject=val是任意对象
self.value=val
}
}
}
结构条
{
var bar=0
}
设b=Foo(val:Bar())
打印(b.isObject)/->true
如何使其在Swift 3中正常工作?在Swift 3中,由于引入了(有关更多信息,请参阅),所有内容都可以桥接到任何对象,可以将任何不能直接桥接到Objective-C的内容包装在不透明的Objective-C兼容框中 因此,
是AnyObject
将始终为真,因为任何东西都可以通过包装在\u SwiftValue
中表示为AnyObject
检查值是否为引用类型的一种方法(如中所示)是根据AnyObject
,AnyClass
(又称AnyObject.type
)的元类型检查值的类型
对于泛型,如果要检查T
的静态类型是否为引用类型,可以执行以下操作:
isObject = T.self is AnyClass
如果要检查键入为T
的值的动态类型是否为引用类型(例如示例中的val
),可以对展开的值使用type(of:)
函数,如上述问答所示:
if let val = val {
isObject = type(of: val) is AnyClass
// ...
}
这两种方法的区别在于,当
T
类型为Any
(或非AnyObject
抽象类型)时,T.self为AnyClass
将返回false
(如果您想要一个值可以是引用或值类型的框,这可能很有用)–类型(of:val)is AnyClass
但是,将返回val
本身是否为引用类型 甚至90是AnyObject
返回true
。听起来像个虫子。相关: