最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

誕生

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

區(qū)別

在 Swift 中編譯器會對 AnyObject 實(shí)例的方法調(diào)用做檢查,還會返回一個 Optional 的結(jié)果。

原理

public typealias AnyObject
// The protocol to which all class types implicitly conform.

由定義就可以看出它就是一個接口,所有的 class 都隱式地實(shí)現(xiàn)了這個借口。所以 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)
 }
}

這種寫法是會報(bào)錯的,String 不符合預(yù)期類型 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 轉(zhuǎn)成了 AnyObject。實(shí)際上 array 里面的元素已經(jīng)變成了 NSString 和 NSArray 了。

當(dāng)然我們還有另外的方式解決此問題,用 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)
 }
}

可以看到結(jié)果全部是 swift 中的原生類型:

注意

  • 只是用 swift 類型而不轉(zhuǎn)為 Cocoa 類型是會提升性能的,所以我們最好還是使用原生類型。
  • 在 OC 和 swift 混編的工程中使用 AnyObject 和 Any 是在所難免的,但我們要盡量避免使用這兩者,swift 中最好明確地指出確定的類型。
  • 如果我們的代碼經(jīng)常用到這兩者,意味著代碼可能在結(jié)構(gòu)和設(shè)計(jì)上存在問題。

下面來舉例說明:

1.Any -- 比如我們經(jīng)常使用的參數(shù)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四種類型的參數(shù),最后使用as [String : Any] ,就是說,parameters的key是String類型,但是value值可以是任何類型。

2.AnyObject -- 在做網(wǎng)絡(luò)請求的時(shí)候

typealias Complicate = (AnyObject) ->Void
//請求回調(diào)
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數(shù)據(jù)轉(zhuǎn)為字典
complicate(value as AnyObject)
}
case .failure: ()
DMCAlertCenter.default().postAlert(withMessage: "網(wǎng)絡(luò)請求失敗")
return
}
}

可以看到,在返回的json進(jìn)行回調(diào)的時(shí)候,由于value是JSON類型的實(shí)例,complicate(value as AnyObject), 就是將value作為AnyObject傳值出去。

總結(jié)

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

相關(guān)文章

  • Swift 字符串類型及常用方法詳解總結(jié)

    Swift 字符串類型及常用方法詳解總結(jié)

    Swift 字符串是一系列字符的集合。例如 "Hello, World!" 這樣的有序的字符類型的值的集合,它的數(shù)據(jù)類型為 String,接下來文章將詳細(xì)探討
    2021-11-11
  • 如何刪掉編程中的?Switch?語句

    如何刪掉編程中的?Switch?語句

    多重方法是一種有趣的方式,可以幫你擺脫令人討厭的?switch,這篇文章主要介紹了如何刪掉編程中的?Switch?語句,需要的朋友可以參考下
    2022-09-09
  • Swift中初始化init的方法小結(jié)

    Swift中初始化init的方法小結(jié)

    Swift有著超級嚴(yán)格的初始化方法,不僅強(qiáng)化了designated初始化方法的地位,所有不加修飾的init方法都需要在方法中確保非Optional的實(shí)例變量被賦值初始化,下面這篇文章主要給大家介紹了關(guān)于Swift中初始化init的相關(guān)資料,需要的朋友可以參考下。
    2018-04-04
  • Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)詳解

    Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Swift循環(huán)遍歷集合的方法總結(jié)分享

    Swift循環(huán)遍歷集合的方法總結(jié)分享

    SWIFT是蘋果于2014年WWDC發(fā)布的新開發(fā)語言,可與Objective-C*共同運(yùn)行于Mac OS和iOS平臺,用于搭建基于蘋果平臺的應(yīng)用程序。這篇文章主要給大家總結(jié)介紹了關(guān)于Swift循環(huán)遍歷集合的方法,如for-in循環(huán)、for循環(huán)以及基于塊的遍歷等方法,需要的朋友可以參考下。
    2017-03-03
  • Swift之UITabBarController 導(dǎo)航控制器的自定義

    Swift之UITabBarController 導(dǎo)航控制器的自定義

    本文給大家介紹swift導(dǎo)航控制器之UITabBarController,本文通過代碼實(shí)例給大家講解swift導(dǎo)航控制器,導(dǎo)航控制器類繼承UITabBarController,代碼簡單易懂,需要的朋友可以參考下
    2015-10-10
  • 深入理解Swift語言中的閉包機(jī)制

    深入理解Swift語言中的閉包機(jī)制

    這篇文章主要介紹了Swift語言中的閉包機(jī)制,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Swift中的條件切換語句switch...case學(xué)習(xí)教程

    Swift中的條件切換語句switch...case學(xué)習(xí)教程

    這篇文章主要介紹了Swift中的條件切換語句switch...case學(xué)習(xí)教程,Swift中的switch...case支持的數(shù)據(jù)類型很多,非常之強(qiáng)大,需要的朋友可以參考下
    2016-04-04
  • Swift中switch語句區(qū)間和元組模式匹配

    Swift中switch語句區(qū)間和元組模式匹配

    這篇文章主要介紹了Swift中switch語句區(qū)間和元組模式匹配的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12

最新評論

许昌市| 宜章县| 亳州市| 伊通| 祁门县| 洪雅县| 筠连县| 西充县| 隆昌县| 资中县| 曲靖市| 调兵山市| 中江县| 大埔县| 昌邑市| 宁都县| 通榆县| 磴口县| 德令哈市| 准格尔旗| 错那县| 昌邑市| 健康| 资中县| 浠水县| 五原县| 平塘县| 建始县| 泊头市| 双流县| 万荣县| 开平市| 深水埗区| 水城县| 广宗县| 定南县| 罗平县| 科尔| 宜宾县| 天镇县| 林口县|