誕生
swift/133186.html">swift/285283.html">swift 作為新起步的語言,必然拋不掉一些歷史遺留包袱。用過 Objective-C 的同學肯定知道有一種叫做 id 的類型。他可以表示任意類的實例,編譯器不會對其類型聲明的變量進行檢查。在用 swift 做 app 開發時,為了能適配 Cocoa 架構,AnyObject 就誕生了。它可以代表任意 class 類型(用來替代OC中的 id)。
區別
在 Swift 中編譯器會對 AnyObject 實例的方法調用做檢查,還會返回一個 Optional 的結果。
原理
public typealias AnyObject// The protocol to which all class types implicitly conform.
由定義就可以看出它就是一個接口,所有的 class 都隱式地實現了這個借口。所以 AnyObject 只適用于 class 類型。但是 swift 中的基本類型都是 struct 類型,并不能用 AnyObject 來表示。所以官方又提出了一個更特殊的 Any 類型,它除了 class 以外還可以表示其他類型,可以說是任意類型(包括 struct,enum,func等)。
import UIKitclass 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,并且系統提示了我們怎么修改:
Argument type 'String' does not conform to expected type 'AnyObject' Insert ' as AnyObject'
按提示修改后:
import UIKitclass 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 UIKitclass 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 中的原生類型:
注意
下面來舉例說明:
1.Any -- 比如我們經常使用的參數parameters
parameters = ["appId":"123456", "timestamp":203428394820,"version":"1.0", "appAuthToken":"7D8SF7D8VS8987D67687", "bizContent":["pageStart":1, "pageSize": "10","isTrue":true]] as [String : Any]
這里面包括了String,Int,Bool,Dictionnary四種類型的參數,最后使用as [String : Any] ,就是說,parameters的key是String類型,但是value值可以是任何類型。
2.AnyObject -- 在做網絡請求的時候
typealias Complicate = (AnyObject) ->Void//請求回調var complicate : Complicate?func request(type:RequestType, URLString:String, parameters:[String : AnyObject], complicate:@escaping Complicate) -> Void {CK().maskShow()switch type {case .requestTypeGet:Alamofire.request(URLString, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: nil).validate().responseJSON { response inCK().dismissMask()switch response.result{case .success:if let value = response.result.value{//把得到的JSON數據轉為字典complicate(value as AnyObject)}case .failure: ()DMCAlertCenter.default().postAlert(withMessage: "網絡請求失敗")return}}
可以看到,在返回的json進行回調的時候,由于value是JSON類型的實例,complicate(value as AnyObject), 就是將value作為AnyObject傳值出去。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答