欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

swift中AnyObject和Any的介紹與區(qū)別詳解

 更新時間:2017年12月18日 09:32:34   作者:Inlight  
雖然使用swift開發(fā)了一段時間,但是感覺對一些基礎的東西了解不是比較透徹,在查詢了許多資料以后還是打算自己動手記錄一下,下面這篇文章主要給大家介紹了關于swift中AnyObject和Any的介紹與區(qū)別的相關資料,需要的朋友可以參考下。

誕生

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

區(qū)別

在 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 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,并且系統(tǒng)提示了我們怎么修改:

Argument type 'String' does not conform to expected type 'AnyObject' Insert ' as AnyObject'

按提示修改后:

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 中的原生類型:

注意

  • 只是用 swift 類型而不轉為 Cocoa 類型是會提升性能的,所以我們最好還是使用原生類型。
  • 在 OC 和 swift 混編的工程中使用 AnyObject 和 Any 是在所難免的,但我們要盡量避免使用這兩者,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 in
CK().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傳值出去。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Swift 4最全的新特性詳細解析(推薦)

    Swift 4最全的新特性詳細解析(推薦)

    Swift 4 在 Swift 3 的基礎上,提供了更強大的穩(wěn)健性和穩(wěn)定性。所以下面這篇文章就來給大家總結介紹關于Swift4新特性的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-11-11
  • swiftui開發(fā)之padding默認值設置詳解

    swiftui開發(fā)之padding默認值設置詳解

    這篇文章主要為大家介紹了swiftui開發(fā)之padding默認值設置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Spring中BeanFactory與FactoryBean的區(qū)別解讀

    Spring中BeanFactory與FactoryBean的區(qū)別解讀

    這篇文章主要介紹了Spring中BeanFactory與FactoryBean的區(qū)別解讀,Java的BeanFactory是Spring框架中的一個接口,它是用來管理和創(chuàng)建對象的工廠接口,在Spring中,我們可以定義多個BeanFactory來管理不同的組件,需要的朋友可以參考下
    2023-12-12
  • Swift心得筆記之控制流

    Swift心得筆記之控制流

    控制流(Control Flow)我不想這么譯的。。。我更想叫控制語句,但是想想,這么叫也沒錯,意指流程控制。大部分用法跟C類似。
    2015-04-04
  • iOS Swift UICollectionView橫向分頁滾動,cell左右排版問題詳解

    iOS Swift UICollectionView橫向分頁滾動,cell左右排版問題詳解

    UICollectionView是iOS中比較常見的一個控件,這篇文章主要給大家介紹了關于iOS Swift UICollectionView橫向分頁滾動,cell左右排版問題的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨小編來一起學習學習吧。
    2017-12-12
  • Swift如何使用類型擦除及自定義詳解

    Swift如何使用類型擦除及自定義詳解

    有很多地方會用到類型擦除,并且它們的作用的各不相同。下面這篇文章主要給大家介紹了關于Swift如何使用類型擦除及自定義的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-10-10
  • Swift類型創(chuàng)建之自定義一個類型詳解

    Swift類型創(chuàng)建之自定義一個類型詳解

    這篇文章主要介紹了Swift類型創(chuàng)建之自定義一個類型詳解,本文講解了自定義原型、實現默認值、支持基本布爾型初始化、支持Bool類型判斷、支持兼容各們各派的類型、完善OCBool的布爾基因體系等內容,需要的朋友可以參考下
    2015-05-05
  • 在Swift中使用KVO的細節(jié)以及內部實現解析(推薦)

    在Swift中使用KVO的細節(jié)以及內部實現解析(推薦)

    這篇文章主要介紹了在Swift中使用KVO的細節(jié)以及內部實現解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Swift項目中利用SWRevealViewController實現側滑菜單

    Swift項目中利用SWRevealViewController實現側滑菜單

    這篇文章主要介紹了Swift項目中利用SWRevealViewController實現側滑菜單,需要的朋友可以參考下
    2015-12-12
  • Swift教程之屬性詳解

    Swift教程之屬性詳解

    這篇文章主要介紹了Swift教程之屬性詳解,屬性是描述特定類、結構或者枚舉的值,計算屬性存在于類、結構與枚舉中,存儲屬性僅僅只在類與結構中,需要的朋友可以參考下
    2015-01-01

最新評論