如何正确检查是否成功向下转换到AnyObject ?



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

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

给了我编译器警告:

  1. 从'T'到'AnyObject'的条件强制转换总是成功的
  2. 用于检查的'AnyObject'类型的非可选表达式可选

我明白为什么剧组总是成功,但我不知道该怎么做来修复它。我试着把2号线转到if let object = foo as AnyObject?但是当我通过函数传递一个结构体时,它仍然会进入if块。我遗漏了什么?

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

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.

可以检查变量的类型是否为AnyObject。如果是,它就是一个引用类型。如果不是,它就是一个值类型。我在操场上也得到了警告,但警告是错误的。下面的代码产生了false, false, false, false, false, true,所以很明显,函数可以工作,并且测试并不总是像警告所说的那样为真。这是一个bug。

    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()))

相关内容

最新更新