swift 中的 AnyObject 和 Any

誕生

swift 做爲新起步的語言,必然拋不掉一些歷史遺留包袱。用過 Objective-C 的同窗確定知道有一種叫作 id 的類型。他能夠表示任意類的實例,編譯器不會對其類型聲明的變量進行檢查。在用 swift 作 app 開發時,爲了能適配 Cocoa 架構,AnyObject 就誕生了。它能夠表明任意 class 類型(用來替代OC中的 id)。swift

區別

在 Swift 中編譯器會對 AnyObject 實例的方法調用作檢查,還會返回一個 Optional 的結果。bash

原理

public typealias AnyObject
// The protocol to which all class types implicitly conform.
複製代碼

由定義就能夠看出它就是一個接口,全部的 class 都隱式地實現了這個藉口。因此 AnyObject 只適用於 class 類型。可是 swift 中的基本類型都是 struct 類型,並不能用 AnyObject 來表示。因此官方又提出了一個更特殊的 Any 類型,它除了 class 之外還能夠表示其餘類型,能夠說是任意類型(包括 struct,enum,func等)。架構

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let swiftArr = ["a", "b", "c"]
        let swiftStr = "hello world"
        
        var array = [AnyObject]()
        array.append(swiftArr)
        array.append(swiftStr)
    }
}
複製代碼

這種寫法是會報錯的,String 不符合預期類型 AnyObject,而且系統提示了咱們怎麼修改:app

Argument type 'String' does not conform to expected type 'AnyObject' Insert ' as AnyObject'
複製代碼

按提示修改後:ide

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let swiftArr = ["a", "b", "c"]
        let swiftStr = "hello world"
        
        var array = [AnyObject]()
        array.append(swiftArr as AnyObject)
        array.append(swiftStr as AnyObject)
    }
}
複製代碼

這裏咱們顯示的將 swift 中的 String 和 Array 轉成了 AnyObject。實際上 array 裏面的元素已經變成了 NSString 和 NSArray 了。性能

固然咱們還有另外的方式解決此問題,用 Any。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let swiftArr = ["a", "b", "c"]
        let swiftStr = "hello world"
        
        var array = [Any]()
        array.append(swiftArr)
        array.append(swiftStr)
    }
}
複製代碼

能夠看到結果所有是 swift 中的原生類型:ui

注意

  • 只是用 swift 類型而不轉爲 Cocoa 類型是會提高性能的,因此咱們最好仍是使用原生類型。
  • 在 OC 和 swift 混編的工程中使用 AnyObject 和 Any 是在所不免的,但咱們要儘可能避免使用這二者,swift 中最好明確地指出肯定的類型。
  • 若是咱們的代碼常常用到這二者,意味着代碼可能在結構和設計上存在問題。
相關文章
相關標籤/搜索