1

我正在处理一些微不足道的事情:

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”块。我在这里想念什么?

4

2 回答 2

0

您可以检查变量的类型是否为 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()))
于 2016-10-28T23:10:10.423 回答
0

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

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.

您可以在线尝试,这里。

于 2016-10-28T22:59:29.527 回答