如何正确检查是不是成功向下转换为 AnyObject?

Posted

技术标签:

【中文标题】如何正确检查是不是成功向下转换为 AnyObject?【英文标题】:How do I correctly check for a successful downcast to AnyObject?如何正确检查是否成功向下转换为 AnyObject? 【发布时间】:2016-10-28 22:37:31 【问题描述】:

我正在处理一些琐碎的事情:

func isAnyObject<T>(someObject: T) 
    if let object = someObject as? AnyObject 
        // do something
     else 
        // do something else
    

这给了我编译器警告:

    从“T”到“AnyObject”的条件转换总是成功 在检查中使用的“AnyObject”类型的非可选表达式 选项

我明白为什么演员表总是成功,但我不知道该怎么做才能解决它。我尝试将第 2 行更改为 if let object = foo as AnyObject? 但是当我通过函数传递一个结构时,它仍然进入'if'块。我在这里错过了什么?

【问题讨论】:

你为什么要选角? P.s.,不要在函数签名中写-&gt; Void 糟糕。我不知道我是否完全理解演员表的目的,但是,出于我自己的意图,我只是看看传递一个结构对象并让它击中“else”块需要什么跨度> Check if `Any` value is object的可能重复 也相关:***.com/questions/39033194/… 【参考方案1】:

实际上,我无法重现您所展示的错误。但是,编译器确实会抱怨函数参数中的明显错误。

import Foundation

func isAnyObject<T>( _ someObject: T) 
    if let object = someObject as? AnyObject 
        print("It's an AnyObject: \(object)")
     else 
        print("It's not an AnyObject.")
    


let classObject: NSString = "This is an NSString Object"
let structInstance: String = "This is a Swift String Instance"

isAnyObject(classObject) // It's an AnyObject: This is an NSString Object
isAnyObject(structInstance) // It's not an AnyObject.

You can try it online, here.

【讨论】:

抱歉。为了简化我的代码 sn-p,我引入了很多错别字。虽然我没有通过沙箱收到任何警告,但将相同的代码插入 Playground 或 XCode 仍然会收到我上面列出的两个警告。 有趣,我也收到了 Xcode 中的警告。这种行为可能是 Swift 对结构类型自动装箱的副作用。【参考方案2】:

您可以检查变量的类型是否为 AnyObject。如果是这样,它是一个引用类型。如果不是它的值类型。我也在操场上收到警告,但警告是错误的。下面的代码产生了假、假、假、假、真,因此很明显该功能有效,并且测试并不总是如警告所说的那样正确。这是一个错误。

    func isReferenceType<T>(someObject: T) -> Bool 
        return type(of: someObject) is AnyObject
    

    //Values
    print(isReferenceType(someObject: "a"))
    print(isReferenceType(someObject: 1))
    print(isReferenceType(someObject: Int?(0)))
    print(isReferenceType(someObject: print("1")))
    //Reference
    print(isReferenceType(someObject: UIView()))

【讨论】:

谢谢。这就是让我陷入困境的原因。我的印象是 Struct 不能强制转换为 AnyObject 但是当我创建一个结构并尝试这个时:SomeStruct() is AnyObject 它返回 true。知道为什么会这样吗? 你可以写someObject is AnyObject,不写type(of:) 另外,我想知道我用这行 if let object = someObject as? AnyObject 写的是否有问题,因为即使使用 UIView 测试我的“isAnyObject”,我仍然会进入“if”语句 @AlexanderMomchliov 如果你省略类型,你会得到 true、true、true、true、true,这很奇怪,因为其中只有一个是引用类型。这就是为什么你需要 type(of:) 的原因。它不一样。 @JoshHomann 很有趣,所以发生的任何自动装箱行为只会影响结构的实例,而不影响结构类型本身

以上是关于如何正确检查是不是成功向下转换为 AnyObject?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中正确地向下转换

从“字符串”到“字符串”的条件向下转换总是成功 - Swift 错误

如何将多个查找和替换转换为更有效的循环

如何检查nginx安装是不是成功

如何将 Python 2 unicode() 函数转换为正确的 Python 3.x 语法

C#中如何检查文本框的输入信息是不是为数字?