Any 和 AnyObject的區(qū)別

之前在使用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 {

}

從以上可以看出AnyAnyObject都是協(xié)議而且,并且從Apple提供的注釋中可以看出所有的類型都隱式實現(xiàn)了Any協(xié)議,所有的class都隱式實現(xiàn)了AnyObject協(xié)議。

可以總結(jié)為:###

  • AnyObjectAny的子集
  • 所有用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
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容