如何正确检查AnyObject的成功向下转换?

时间:2016-10-28 22:37:31

标签: swift3 anyobject

我正在处理一些对此无关紧要的事情:

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

这给了我编译器警告:

  1. 来自&#39; T&#39;到任何对象&#39;总是成功
  2. 类型&#39; AnyObject&#39;的非可选表达式用于检查 自选
  3. 我理解为什么演员总是成功,但我不知道如何解决它。我尝试将第2行更改为 if let object = foo as AnyObject? 但是当我通过该函数传递一个结构时,它仍然会进入&#39;如果&#39;块。我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

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

df %>% rename_(.dots = setNames(paste0('`', names(.), '`'), 
                                gsub("<?(-?[0-9A-Z]*)>?", "Port\\1", names(.))))

## # A tibble: 500 × 3
##    Port1 Port2 PortNA
##    <int> <int>  <int>
## 1      1     1      1
## 2      2     2      2
## 3      3     3      3
## 4      4     4      4
## 5      5     5      5
## 6      6     6      6
## 7      7     7      7
## 8      8     8      8
## 9      9     9      9
## 10    10    10     10
## # ... with 490 more rows

You can try it online, here.

答案 1 :(得分:0)

您可以检查变量的类型是否为AnyObject。如果是这样的话它的引用类型。如果不是它的值类型。我也在操场上发出警告,但警告是错误的。下面的代码产生false,false,false,false,true,因此很清楚该函数是有效的,并且测试并不总是如警告所说的那样。这是一个错误。

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