Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何测试泛型变量是否为AnyObject类型_Swift_Swift3 - Fatal编程技术网

Swift 如何测试泛型变量是否为AnyObject类型

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

在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
        {
            // 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
。听起来像个虫子。相关: