当前位置: 首页 > 面试题库 >

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

匡玉堂
2023-03-14
问题内容

在Swift3中,我不再能够检查泛型变量类型是否为class(AnyObject)。下面的代码返回trueisObject即使特定类型T,并通过价值结构,而不是类。在Swift2.3和2.2中,它可以按预期工作,并且isObjectfalse

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

如何使它在Swift 3中正常工作?


问题答案:

在Swift3中,AnyObject由于引入了所有内容_SwiftValue,因此可以将所有不能直接桥接到Objective-
C的内容包装在一个不透明的Objective-C兼容框中。

因此is AnyObject将永远是真实的,因为任何东西都可以表示为AnyObject通过在包装_SwiftValue

检查值是否为一个引用类型)是键入检查的值的类型对的元类型AnyObjectAnyClass(又名AnyObject.Type)。

对于泛型,如果要检查的静态类型T是否为引用类型,则可以执行以下操作:

isObject = T.self is AnyClass

如果要检查 键入 为的值的 动态类型
是否为T引用类型(例如,val在您的示例中),则可以type(of:)对未包装的值使用该函数,如前面的问答所述:

if let val = val {
    isObject = type(of: val) is AnyClass

    // ...
}

这两种方法的区别在于,当Tis是类型Any(或非AnyObject抽象类型)时,T.self is AnyClass将返回false(如果您想要一个值可以是引用或值类型的框,这可能会很有用)– type(of: val) isAnyClass但是,将返回是否为val自身是引用类型。



 类似资料:
  • 本文向大家介绍如何检查JavaScript变量是否为函数类型?,包括了如何检查JavaScript变量是否为函数类型?的使用技巧和注意事项,需要的朋友参考一下 使用“ typeof”检查它是否是一个函数。您可以尝试运行以下代码来检查JavaScript变量是否为函数类型: 示例

  • 我得到以下错误: 初始化中无法将“std::__cxx11::basic_string”转换为“int” 有办法解决这个问题吗?我想把AG变成一个int,这样它就可以被传递到int参数中,或者如果它是int,就可以被测试;或者能够将其值赋给int

  • 问题内容: 我想知道如何检查变量是否是类(不是实例!)。 我试图使用该函数来执行此操作,但我不知道类将具有哪种类型。 例如,在以下代码中 我试图用 ??? 代替“ ” ,但我意识到这是python中的关键字。 问题答案: 更好的是:使用该功能。

  • 问题内容: 我只是不知道如何确定传递给脚本的参数是否为数字。 我要做的就是这样: 有什么帮助吗? 问题答案: 一种方法是使用正则表达式,如下所示: 如果该值不一定是整数,请考虑适当修改正则表达式;例如: …或使用带符号处理数字:

  • 问题内容: 假设我有任何变量,定义如下: 我想要一个检查变量类型是否像函数一样的函数。即: 如何检查变量是否为上述定义的类型? 问题答案: 当然,下划线的方式效率更高,但是当效率不是问题时,最好的检查方法是写在@Paul Rosania链接的下划线页面上。 受下划线启发,最终的isFunction函数如下:

  • 问题内容: 确定JavaScript中的变量是否为数组的最佳事实标准跨浏览器方法是什么? 在网络上搜索时,有很多不同的建议,其中有些是好的,有些是无效的。 例如,以下是基本方法: 但是,请注意,如果数组为空,或者obj实际上不是数组,但是实现了length属性,将会发生什么情况。 那么,从实际工作,跨浏览器和仍有效执行的角度来看,哪种实现是最佳的呢? 问题答案: JS中对象的类型检查是通过完成的,