之前在使用Swift的過(guò)程中沒(méi)有注意到這兩者的區(qū)別,最近看到一篇文章介紹二者的區(qū)別,記下筆記驱还。
AnyObject 可以代表任何 class 類型的實(shí)例
Any 可以表示任意類型,甚至包括方法 (func) 類型
接下來(lái)看下二者的定義
/// 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提供的注釋中可以看出所有的類型都隱式實(shí)現(xiàn)了Any協(xié)議议蟆,所有的class都隱式實(shí)現(xiàn)了AnyObject協(xié)議。
可以總結(jié)為:###
AnyObject
是Any
的子集
- 所有用
class
關(guān)鍵字定義的對(duì)象就是AnyObject
- 所有不是用
class
關(guān)鍵字定義的對(duì)象就不是AnyObject
,而是Any
測(cè)試代碼:
func test(testObject object:Any) -> String {
if object is AnyObject {
return "傳入的是一個(gè)引用(class)類型"
}
return "傳入的是一個(gè)值類型"
}
/// 測(cè)試Block類型
let block = {
print("Hello World")
}
/// 測(cè)試元組
let http404Error = (404, "Not Found")
/// 測(cè)試數(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))
測(cè)試結(jié)果:
從測(cè)試結(jié)果可以看出array2和array3的結(jié)果不符合預(yù)期萎战,看看是不是被隱式轉(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")
}
測(cè)試結(jié)果2: