日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

初探swift语言的学习笔记二(可选类型?和隐式可选类型!)

發(fā)布時(shí)間:2024/9/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初探swift语言的学习笔记二(可选类型?和隐式可选类型!) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28904115 轉(zhuǎn)載請(qǐng)注明出處 如果覺得文章對(duì)你有所幫助,請(qǐng)通過(guò)留言或關(guān)注微信公眾帳號(hào)fengsh998來(lái)支持我,謝謝!


可選類型、隱式可選類型

在swift中,可選類型其根源是一個(gè)枚舉型,里面有None和Some兩種類型。其實(shí)所謂的nil就是Optional.None, 非nil就是Optional.Some, 然后會(huì)通過(guò)Some(T)包裝(wrap)原始值,這也是為什么在使用Optional的時(shí)候要拆包(從enum里取出來(lái)原始值)的原因, 也是PlayGround會(huì)把Optional值顯示為類似{Some "hello world"}的原因,這里是enum Optional的定義:

[cpp]?view plaincopy
  • enum?Optional<T>?:?LogicValue,?Reflectable?{??
  • ????case?None??
  • ????case?Some(T)??
  • ????init()??
  • ????init(_?some:?T)??
  • ??
  • ????///?Allow?use?in?a?Boolean?context.??
  • ????func?getLogicValue()?->?Bool??
  • ??
  • ????///?Haskell's?fmap,?which?was?mis-named??
  • ????func?map<U>(f:?(T)?->?U)?->?U???
  • ????func?getMirror()?->?Mirror??
  • }??


  • 語(yǔ)法使用“?”操作符及"!"號(hào)操作符

    如:“var optionalString: String? =?"Hello"
    optionalString == nil
    ?
    var optionalName: String? = "John Appleseed"
    var greeting = "Hello!"
    if let name = optionalName {
    ? ? greeting = "Hello, \(name)"
    }”

    大家把optionalName改為nil時(shí)看一下會(huì)有什么結(jié)果?按照理解,應(yīng)該是? = 后的為可選值,即當(dāng)我們的的變量為nil時(shí),這里如果有?=操作,則會(huì)使用?=后的值作為默認(rèn)值,而不會(huì)為nil. 這個(gè)等有環(huán)境時(shí),驗(yàn)證一下。

    經(jīng)驗(yàn)證:

    分別執(zhí)行:

    [cpp]?view plaincopy
  • var?optional?:String??=?"ok?good";//注意?與=號(hào)之間有空格?號(hào)緊貼最后一個(gè)字母不能有空格??
  • println(optional)??
  • 輸出為:

    ok good

    [cpp]?view plaincopy
  • var?optional?:String?//注意?與=號(hào)之間有空格?號(hào)緊貼最后一個(gè)字母不能有空格??
  • println(optional)??

  • 輸出為:

    nil


    來(lái)看下!號(hào),官方釋為隱式解包:主要用在一個(gè)變量/常量在定義瞬間完成之后值一定會(huì)存在的情況。這主要用在類的初始化過(guò)程中。

    官風(fēng)例子:

    [cpp]?view plaincopy
  • let?possibleString:?String??=?"An?optional?string."??
  • println(possibleString!)?//?requires?an?exclamation?mark?to?access?its?value??
  • //?prints?"An?optional?string."??
  • ??
  • let?assumedString:?String!?=?"An?implicitly?unwrapped?optional?string."??
  • println(assumedString)?//?no?exclamation?mark?is?needed?to?access?its?value??
  • 實(shí)說(shuō)話,你照這個(gè)例子運(yùn)行,還真看不出什么,得不出什么結(jié)論。因此我自己Z磨著,試著理解一個(gè)英文翻譯。再自己操刀練習(xí)。得出下面的一些結(jié)論。

    [cpp]?view plaincopy
  • var?optionVariables:String??//?相當(dāng)于下面這種寫法的語(yǔ)法糖??
  • //var?optionVariables?:?Optional<Int>??
  • let?value?=?optionVariables?.hashValue??
  • /*?
  • optionVariables是可選類型的字符串,如果optionVariables是nil,則hashValue也為nil?
  • 如果optionVariables不為nil,hashValue就是strValue字符串的哈希值?
  • 到這里我們看到了?的兩種使用場(chǎng)景:?
  • 1.聲明Optional值變量?
  • 2.用在對(duì)Optional值操作中,用來(lái)判斷是否能響應(yīng)后面的操作?
  • */??
  • ??
  • //對(duì)于可選類型變量,不能直接進(jìn)行操作,否則會(huì)報(bào)錯(cuò)??
  • //let?hashval?=?optionVariables.hashValue?//'String?'?does?not?have?a?member?named?'hashValue'??
  • //因此要訪問(wèn)值就需要解包,解包有兩種??
  • //第一種:使用if?let/var?xxx?=???
  • if?let?hv?=?optionVariables??
  • {??
  • ????//run?ok;??
  • }??
  • ??
  • //第二種:使用!號(hào)??
  • let?hv?=?optionVariables!.hashValue??
  • ??
  • //這里的!表示“我確定這里的的strValue一定是非nil的,盡情調(diào)用吧”?,比如這種情況:??
  • ??
  • if?optionVariables?{??
  • ????let?hashv?=?optionVariables!.hashValue??
  • }??
  • //{}里的optionVariables一定是非nil的,所以就能直接加上!,強(qiáng)制拆包(unwrap)并執(zhí)行后面的操作??


  • 凡在變量或常量后加上?的都是一個(gè)可選變量/可選常量
    凡在變量或常量后加上!的都是隱式可選變量/常量,有點(diǎn)難理解,首先該變量或常量滿足可選類型,其主要是可被當(dāng)生一般的變量/常量來(lái)使用,而不需要每次都驗(yàn)證是否有值。

    注:如果一個(gè)隱式解包的可選類型不包含一個(gè)實(shí)際值,那么對(duì)它的訪問(wèn)會(huì)拋出一個(gè)運(yùn)行時(shí)錯(cuò)誤。在變量/常量名后面加!的情況也是一樣的。

    [cpp]?view plaincopy
  • var?possibleString:?String??=?"An?optional?string."??
  • //possibleString?=?nil??
  • println(possibleString)?//?possibleString?為可選變量,需要使用!來(lái)訪問(wèn)的值??
  • 分析:首先 possibleString 因后面帶上了?說(shuō)明這是一個(gè)可選的,同時(shí)前面加上var為變量,所以這是一個(gè)可選類型的變量。其可選值為 "An optional string." 再來(lái)看執(zhí)行println后,可以看出輸出為 An optional string. 這點(diǎn)很明顯。再來(lái)看一下把println這句改一下改為 (即在可選變量后面加上一個(gè)!號(hào)。)

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">println(possibleString!)?//?possibleString?為可選變量,需要使用!來(lái)訪問(wèn)的值</span>??
  • 這里結(jié)果與沒有加!號(hào)時(shí)是完全一樣的,輸出為An optional string.?

    好,現(xiàn)在重點(diǎn)來(lái)了,這是很關(guān)鍵的一個(gè)測(cè)試。把possibleString = nil 這句注釋放開讓其動(dòng)行,再分別來(lái)看一下println帶!和不帶!的情況:

    情況一:不帶!號(hào)時(shí),輸出為nil .

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">????????var?possibleString:?String??=?"An?optional?string."??
  • ????????possibleString?=?nil??
  • ????????println(possibleString)?</span>??
  • 情況二:再來(lái)看一下帶!號(hào)

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">????????var?possibleString:?String??=?"An?optional?string."??
  • ????????possibleString?=?nil??
  • ????????println(possibleString!)?//?possibleString?為可選變量,需要使用!來(lái)訪問(wèn)的值</span>??
  • 這時(shí)運(yùn)行到這句println就會(huì)crash了。會(huì)報(bào)

    fatal error: Can't unwrap Optional.None

    錯(cuò)誤。?

    在情況一時(shí),為什么不會(huì)報(bào)錯(cuò),是因?yàn)檫@是一個(gè)可選變量當(dāng)變量為nil時(shí),自動(dòng)驗(yàn)證是否有可選的值,有則使用可選值,在情況二,加上!訪問(wèn)符來(lái)訪問(wèn)possibleString 變量,但由于possibleString設(shè)為了nil (等價(jià)于var possibleString: String?) 其并沒有包含一個(gè)實(shí)際值,所以拋異常.同樣對(duì)于下面使用!號(hào)來(lái)聲明的也一樣道:

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">????????var?assumedString:?String!?=?"An?implicitly?unwrapped?optional?string."??
  • ????????assumedString?=?nil??
  • ????????println(assumedString!)</span>??
  • 同樣會(huì)報(bào):fatal error: Can't unwrap Optional.None

    如果你定義了一個(gè)可選類型并且沒有給予初始值的時(shí)候,會(huì)默認(rèn)設(shè)置為nil
    var surveyAnswer: String? // 初自動(dòng)設(shè)置為nil
    注: Swift 的nil不同于Object-C中的nil. Object-C中,nil是一個(gè)指針指向不存在的對(duì)象。Swift中,nil不是指針而是一個(gè)特定類型的空值。任何類型的可選變量都可以被設(shè)為nil,不光是指針。

    在swift中作何變量/常量的聲明都必須帶有初始值,否則就要聲明為可選型。

    即var btn:UIButton 這樣是編譯報(bào)錯(cuò)的。因些必須改為帶初始化的如:

    var?btn2 :UIButton?=?UIButton()

    或者使用? 和! 來(lái)約束。

    因此常常聲明可選或隱式可選變量如:

    var btn :UIButton? ? ? ?// 默認(rèn)btn = nil

    var edt :UITextField! ?// 默認(rèn)edt = nil

    至于什么時(shí)候使用?什么情況下使用!號(hào)來(lái)約束變量,我還沒有悟出真真原理。

    因此借助于自己的幾次驗(yàn)證來(lái)幫助大家理解。

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">????????var?btn??:UIButton???????//?默認(rèn)btn?=?nil??
  • ????????var?btn2?:UIButton?=?UIButton()????//?默認(rèn)實(shí)例化一個(gè)對(duì)對(duì)象??
  • ????????var?btn3?:UIButton!?????//?默認(rèn)btn?=?nil??
  • ????????//var?btn4?:UIButton????//編譯期報(bào)錯(cuò)?要求進(jìn)行初始化操作??
  • ????????//運(yùn)行會(huì)報(bào)錯(cuò)fatal?error:?Can't?unwrap?Optional.None?因btn?=?nil??
  • ????????btn!.tintColor?=?UIColor.blackColor()??
  • ????????btn!.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????btn!.frame?=?CGRectMake(0,0,50,40)??
  • ??????????
  • ????????//運(yùn)行正常??
  • ????????btn2.tintColor?=?UIColor.blackColor()??
  • ????????btn2.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????btn2.frame?=?CGRectMake(0,0,50,40)??
  • ??????????
  • ????????//運(yùn)行會(huì)報(bào)錯(cuò)fatal?error:?Can't?unwrap?Optional.None?因btn3?=?nil??
  • ????????btn3.tintColor?=?UIColor.blackColor()??
  • ????????btn3.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????btn3.frame?=?CGRectMake(0,0,50,40)</span>??

  • 因此為了運(yùn)行期不crash可以改為如下:

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">????????var?btn??:UIButton???????//?默認(rèn)btn?=?nil??
  • ????????var?btn2?:UIButton?=?UIButton()????//?默認(rèn)實(shí)例化一個(gè)對(duì)對(duì)象??
  • ????????var?btn3?:UIButton!?????//?默認(rèn)btn?=?nil??
  • ??????????
  • ????????//運(yùn)行會(huì)報(bào)錯(cuò)fatal?error:?Can't?unwrap?Optional.None?因btn?=?nil??
  • ????????if?var?tmpbtn?=?btn??
  • ????????{??
  • ????????????btn!.tintColor?=?UIColor.blackColor()??
  • ????????????btn!.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????????btn!.frame?=?CGRectMake(0,0,50,40)??
  • ????????}??
  • ??????????
  • ????????//運(yùn)行正常??
  • ????????btn2.tintColor?=?UIColor.blackColor()??
  • ????????btn2.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????btn2.frame?=?CGRectMake(0,0,50,40)??
  • ??????????
  • ????????//運(yùn)行會(huì)報(bào)錯(cuò)fatal?error:?Can't?unwrap?Optional.None?因btn3?=?nil??
  • ????????if?var?tmpbtn?=?btn??
  • ????????{??
  • ????????????btn3.tintColor?=?UIColor.blackColor()??
  • ????????????btn3.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????????btn3.frame?=?CGRectMake(0,0,50,40)??
  • ????????}</span>??
  • 或者

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">????????var?btn??:UIButton???????//?默認(rèn)btn?=?nil??
  • ????????var?btn2?:UIButton?=?UIButton()????//?默認(rèn)實(shí)例化一個(gè)對(duì)對(duì)象??
  • ????????var?btn3?:UIButton!?????//?默認(rèn)btn?=?nil??
  • ??????????
  • ????????//運(yùn)行會(huì)報(bào)錯(cuò)fatal?error:?Can't?unwrap?Optional.None?因btn?=?nil??
  • ????????if?btn??
  • ????????{??
  • ????????????btn!.tintColor?=?UIColor.blackColor()??
  • ????????????btn!.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????????btn!.frame?=?CGRectMake(0,0,50,40)??
  • ????????}??
  • ??????????
  • ????????//運(yùn)行正常??
  • ????????btn2.tintColor?=?UIColor.blackColor()??
  • ????????btn2.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????btn2.frame?=?CGRectMake(0,0,50,40)??
  • ??????????
  • ????????//運(yùn)行會(huì)報(bào)錯(cuò)fatal?error:?Can't?unwrap?Optional.None?因btn3?=?nil??
  • ????????if?btn3??
  • ????????{??
  • ????????????btn3.tintColor?=?UIColor.blackColor()??
  • ????????????btn3.imageEdgeInsets?=?UIEdgeInsets(top:1,left:2,bottom:3,right:4)??
  • ????????????btn3.frame?=?CGRectMake(0,0,50,40)??
  • ????????}</span>??
  • 注:如果一個(gè)可選類型存在沒有值的可能的話,不應(yīng)該使用解包(隱式)可選類型。這種情況下,一定要使用正常的可選類型。

    這句話我個(gè)人是這樣理解的,如var view:UIView。當(dāng)我的整個(gè)應(yīng)用中或整個(gè)類中不可能存在view = nil的情況時(shí)可以設(shè)置為var view:UIView! 否則就可聲明為var view:UIView?

    與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的初探swift语言的学习笔记二(可选类型?和隐式可选类型!)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 特级黄毛片 | 一区二区三区视频免费观看 | 超碰老司机 | 伊人春色av| 国产成人精品免高潮在线观看 | 在线精品播放 | 久久精品国产99国产精品 | wwwxx国产 | 97精品久久久| 欧美va视频 | 一区二区三区欧美视频 | 天堂网8 | 潘金莲一级淫片aaaaa武则天 | 东北女人啪啪ⅹxx对白 | 被黑人啪到哭的番号922在线 | 婷婷亚洲五月 | 亚洲第九十七页 | 日韩欧美成人免费视频 | 一区在线观看视频 | 最新理伦片eeuss影院 | 欧美成人手机在线 | 都市激情校园春色亚洲 | 亚洲综合色小说 | 国产高清在线一区 | 无码精品人妻一二三区红粉影视 | 日韩最新在线 | 国产精品高清无码在线观看 | 蜜臀久久 | 亚洲国产精品麻豆 | 男人操女人的免费视频 | 国产人妻精品一区二区三区 | 日韩精彩视频 | 人妻丰满熟妇aⅴ无码 | 国产99页 | 日韩天堂一区 | 91最新在线 | 午夜影院试看 | 色啪视频 | 动漫av一区二区三区 | 超碰超在线 | 欧美日韩一区二区三区视频 | 亚洲免费观看高清完整版在线 | 欧美高清大白屁股ass18 | 成人午夜影视在线观看 | 教练含着她的乳奶揉搓揉捏动态图 | 91欧美一区二区 | 久久1234| 夜色一区二区三区 | 国产成人一区二区三区影院在线 | 国产成人在线影院 | 亚洲精品一区二区三区四区五区 | 免费国产一级 | 吊视频一区二区三区 | www黄色大片 | tube日本69第一次 | 国产视频a| 天天亚洲| 国产精品video | 欧美国产精品一区二区三区 | av片在线观看免费 | 国产原创视频在线观看 | 国产在线精品二区 | 久久久一区二区 | 国内自拍视频网站 | 午夜特片网 | 91啦中文 | 色中文字幕在线观看 | 五月婷婷丁香花 | 亚洲Av无码成人精品区伊人 | 疯狂揉花蒂控制高潮h | 自拍欧美亚洲 | 亚洲精品国产精品乱码在线观看 | 欧美黄色大片网站 | 亚洲久久久 | 老司机性视频 | 毛片哪里看 | 在线观看av网 | 四虎影院一区二区 | 麻豆免费av| 日本 在线 | 精品久久一区二区 | 日韩美女视频 | 亚洲精品在线视频观看 | 日本丰满熟妇bbxbbxhd | 九一在线视频 | 一级黄色伦理片 | www四虎| 羞羞的视频网站 | 日韩电影三级 | 国产精品夫妻自拍 | 高潮毛片无遮挡高清免费 | 日本高清不卡视频 | 日本毛片视频 | 原来神马电影免费高清完整版动漫 | 国产高清视频免费 | 午夜资源 | 免费一区二区视频 | 色77777 | 色老妹|