swift3中的Any和AnyObject

作者: 真珠奶茶小土逗 | 来源:发表于2017-01-04 00:44 被阅读112次

最近在项目中导入一个第三方库的时候遇到了一个bug,涉及到AnyAnyObject,查阅资料后发现在swift3中更新了一些使用方法,还是总结一下避免自己之后忘记。

首先简单介绍一下AnyAnyObject,套用喵神的话说,AnyAnyObject是swift中为了妥协而诞生的产物。我们都知道在OC中有一个叫id的神奇的东西,它可以表示任意类的实例,看苹果现在的态度,虽然在大力推行swift,但是短时间内OC是不会消失的,所以两者必须协同发展,所以swift也必须有一个类似于id的东西,否则两者相互调用的时候就会很混乱,于是乎就产生了AnyAnyObject

对于AnyAnyObject,苹果官方给出的解释是:AnyObject可以代表任意class类型,而Any则可以代表任意类型,包括函数类型。在swift3之前的版本中,id被映射为AnyObject,而在swift3中,id被映射为Any。这里有一个概念我比较迷惑,之前看过的一篇文章中有一段代码用来区分AnyAnyObject,是用swift2写的,代码如下:

func test(testObject object:Any) -> String {
    if object is AnyObject {
        return "传入的是一个引用(class)类型"
    }

    return "传入的是一个值类型"
}

/// 测试Block类型
let block = {
    print("Hello World")
}
/// 测试元组
let http404Error = (404, "Not Found")
/// 测试数组
let array1:Array<Any> = []
let array2:Array<Int> = []
let array3:Array<AnyObject> = []

print(test(testObject: block))
print(test(testObject: http404Error))
print(test(testObject: array1))
print(test(testObject: array2))
print(test(testObject: array3))

而当我在swift3中测试的时候,打印出的结果都是“传入引用”。对应的,我们传入的参数分别是闭包,元组和数组,它们都应该是值类型。其中Xcode给出了一个警告:object is AnyObject is always true.那么问题就应该出在这里。object被声明为AnyAny is AnyObject 总是正确的,那么按照我个人的理解,Any代表任何类型,其中就应该包括AnyObject,当出现Any is AnyObject的时候,Any就会根据需要转换为AnyObject,因此就会出现上述的警告。

最后回到自己项目的问题,按照库的作者提供的方法,需要实现cell的一个自定义方法:

cell.rightUtilityButtons = getRightUtilityButtonsToCell()

rightUtilityButtons是一个id类型,在swift中被转换为AnygetRightUtilityButtonsToCell()方法返回一个NSMutableArray类型的数组。这里报了一个错误,显示无法将NSMutableArray类型赋值给[Any]!类型,这里我的理解是:虽然Any可以代表任何类型,但这是swift中的用法,代表的也应该是swift中的所有类型,而NSMutableArray是一个OC类型,应该把它转换成swift类型,所以这里我们使用as转换类型,代码更改为:

cell.rightUtilityButtons = getRightUtilityButtonsToCell() as [AnyObject]!

NSMutableArray类型转换为AnyObject类型,这样就可以赋值成功,bug完美解决。

本文所表述的均是个人的一点浅薄的理解,如有错误的地方烦请各位看官不吝赐教。

相关文章

网友评论

    本文标题:swift3中的Any和AnyObject

    本文链接:https://www.haomeiwen.com/subject/rnanvttx.html