之前在使用Swift的過程中沒有注意到這兩者的區(qū)別,最近看到一篇文章介紹二者的區(qū)別,記下筆記。
AnyObject 可以代表任何 class 類型的實例
Any 可以表示任意類型,甚至包括方法 (func) 類型
接下來看下二者的定義
/// The protocol to which all types implicitly conform.
public typealias Any = protocol<>
/// The protocol to which all classes implicitly conform.
@objc public protocol AnyObject {
}
從以上可以看出Any和AnyObject都是協(xié)議而且,并且從Apple提供的注釋中可以看出所有的類型都隱式實現(xiàn)了Any協(xié)議,所有的class都隱式實現(xiàn)了AnyObject協(xié)議。
可以總結(jié)為:###
AnyObject是Any的子集
- 所有用
class關鍵字定義的對象就是AnyObject
- 所有不是用
class關鍵字定義的對象就不是AnyObject,而是Any
測試代碼:
func test(testObject object:Any) -> String {
if object is AnyObject {
return "傳入的是一個引用(class)類型"
}
return "傳入的是一個值類型"
}
/// 測試Block類型
let block = {
print("Hello World")
}
/// 測試元組
let http404Error = (404, "Not Found")
/// 測試數(shù)組
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))
測試結(jié)果:

test1.jpg
從測試結(jié)果可以看出array2和array3的結(jié)果不符合預期,看看是不是被隱式轉(zhuǎn)換為NSArray了。
if array1 is NSArray {
print("array1 is converted to NSArray")
}
if array2 is NSArray {
print("array1 is converted to NSArray")
}
if array3 is NSArray {
print("array1 is converted to NSArray")
}
測試結(jié)果2:

test2.jpg