亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swift之 ? 和 !的差異

2019-11-09 18:42:44
字體:
來源:轉載
供稿:網友

Swift語言使用var定義變量,但和別的語言不同,Swift里不會自動給變量賦初始值,也就是說變量不會有默認值,所以要求使用變量之前必須要對其初始化。如果在使用變量之前不進行初始化就會報錯:

var stringValue : String //error: variable 'stringValue' used before being initialized//let hashValue = stringValue.hashValue// ^let hashValue = stringValue.hashValue上面了解到的是普通值,接下來Optional值要上場了。經喵神提醒,Optional其實是個enum,里面有None和Some兩種類型。其實所謂的nil就是Optional.None, 非nil就是Optional.Some, 然后會通過Some(T)包裝(wrap)原始值,這也是為什么在使用Optional的時候要拆包(從enum里取出來原始值)的原因, 也是PlayGround會把Optional值顯示為類似{Some "hello world"}的原因,這里是enum Optional的定義: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}

聲明為Optional只需要在類型后面緊跟一個?即可。如:

var strValue: String? //?相當于下面這種寫法的語法糖var strValue: Optional<String>

上面這個Optional的聲明,意思不是”我聲明了一個Optional的String值”, 而是”我聲明了一個Optional類型值,它可能包含一個String值,也可能什么都不包含”,也就是說實際上我們聲明的是Optional類型,而不是聲明了一個String類型,這一點需要銘記在心。 建議再讀一遍上段文字。 一旦聲明為Optional的,如果不顯式的賦值就會有個默認值nil。判斷一個Optional的值是否有值,可以用if來判斷:

if strValue { //do sth with strValue}然后怎么使用Optional值呢?文檔中也有提到說,在使用Optional值的時候需要在具體的操作,比如調用方法、屬性、下標索引等前面需要加上一個?,如果是nil值,也就是Optional.None,會跳過后面的操作不執行,如果有值,就是Optional.Some,可能就會拆包(unwrap),然后對拆包后的值執行后面的操作,來保證執行這個操作的安全性,比如:let hashValue = strValue?.hashValue

strValue是Optional的字符串,如果strValue是nil,則hashValue也為nil,如果strValue不為nil,hashValue就是strValue字符串的哈希值(其實也是用Optional wrap后的值)

另外,?還可以用在安全地調用PRotocol類型方法上,比如:

@objc protocol Downloadable { @optional func download(toPath: String) -> Bool;}@objc class Content: Downloadable { //download method not be implemented}var delegate: Downloadable = Downloadable()delegate.download?("some path")

因為上面的delegate是Downloadable類型的,它的download方法是optional,所以它的具體實現有沒有download方法是不確定的。Swift提供了一種在參數括號前加上一個?的方式來安全地調用protocol的optional方法。

另外如果你需要像下面這樣向下轉型(Downcast),可能會用到 as?:

if let dataSource = object as? UITableViewDataSource { let rowsInFirstSection = dataSource.tableView(tableView, numberOfRowsInSection: 0)}

到這里我們看到了?的幾種使用場景:

1.聲明Optional值變量2.用在對Optional值操作中,用來判斷是否能響應后面的操作3.用于安全調用protocol的optional方法4.使用 as? 向下轉型(Downcast)

另外,對于Optional值,不能直接進行操作,否則會報錯:

//error: 'String?' does not have a member named 'hashValue'//let hashValue = strValue.hashValue// ^ ~~~~~~~~~let hashValue = strValue.hashValue

上面提到Optional值需要拆包(unwrap)后才能得到原來值,然后才能對其操作,那怎么來拆包呢?拆包提到了幾種方法,一種是Optional Binding, 比如:

if let str = strValue { let hashValue = str.hashValue}

還有一種是在具體的操作前添加!符號,好吧,這又是什么詭異的語法?!

直接上例子,strValue是Optional的String:

let hashValue = strValue!.hashValue

這里的!表示“我確定這里的的strValue一定是非nil的,盡情調用吧” ,比如這種情況:

if strValue { let hashValue = strValue!.hashValue}

{}里的strValue一定是非nil的,所以就能直接加上!,強制拆包(unwrap)并執行后面的操作。 當然如果不加判斷,strValue不小心為nil的話,就會出錯,crash掉。

考慮下這一種情況,我們有一個自定義的MyViewController類,類中有一個屬性是myLabel,myLabel是在viewDidLoad中進行初始化。因為是在viewDidLoad中初始化,所以不能直接聲明為普通值:var myLabel : UILabel,因為非Optional的變量必須在聲明時或者構造器中進行初始化,但我們是想在viewDidLoad中初始化,所以就只能聲明為Optional:var myLabel: UILabel?, 雖然我們確定在viewDidLoad中會初始化,并且在ViewController的生命周期內不會置為nil,但是在對myLabel操作時,每次依然要加上!來強制拆包(在讀取值的時候,也可以用?,謝謝ipresent在回復中提醒),比如:

myLabel!.text = "text"myLabel!.frame = CGRectMake(0, 0, 10, 10)...

對于這種類型的值,我們可以直接這么聲明:var myLabel: UILabel!, 果然是高(hao)大(gui)上(yi)的語法!, 這種是特殊的Optional,稱為Implicitly Unwrapped Optionals, 直譯就是隱式拆包的Optional,就等于說你每次對這種類型的值操作時,都會自動在操作前補上一個!進行拆包,然后在執行后面的操作,當然如果該值是nil,也一樣會報錯crash掉。

var myLabel: UILabel! //!相當于下面這種寫法的語法糖var myLabel: ImplicitlyUnwrappedOptional<UILabel>那么!大概也有兩種使用場景1.強制對Optional值進行拆包(unwrap)2.聲明Implicitly Unwrapped Optionals值,一般用于類中的屬性
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲桃花岛网站| 国产国语刺激对白av不卡| 日本精品性网站在线观看| 亚洲精品视频在线观看视频| 91av在线免费观看视频| 日韩av最新在线观看| 国产国语videosex另类| 国产精品美女在线观看| 国产日韩中文字幕在线| 国产+人+亚洲| 国产极品精品在线观看| 久久久国产精彩视频美女艺术照福利| 亚洲免费电影在线观看| 亚洲第一二三四五区| 精品一区二区亚洲| 中文字幕一区二区精品| 正在播放欧美视频| 中文字幕av日韩| 黑人巨大精品欧美一区二区三区| 精品亚洲va在线va天堂资源站| 国产一区二区免费| 神马久久桃色视频| y97精品国产97久久久久久| 日韩电视剧免费观看网站| 欧美大片在线影院| 日韩在线观看你懂的| 92裸体在线视频网站| www.日韩视频| 亚洲一二三在线| 亚洲亚裔videos黑人hd| 中文字幕欧美日韩va免费视频| 在线成人激情黄色| 久久精品久久久久电影| 欧美日韩国产精品一区| 国产91精品黑色丝袜高跟鞋| 一夜七次郎国产精品亚洲| 伊人青青综合网站| 亚洲第一区第二区| 国产欧美日韩视频| 欧美性jizz18性欧美| 久久人人97超碰精品888| 欧美大片在线看免费观看| 日韩av色综合| 成人综合国产精品| 亚洲欧美另类在线观看| 国产一区二区三区中文| 91精品国产色综合久久不卡98口| 性欧美暴力猛交69hd| 午夜精品在线视频| 国产精品爽黄69| 亚洲激情自拍图| 日本视频久久久| 国产第一区电影| 国产亚洲a∨片在线观看| 欧美性猛交丰臀xxxxx网站| 亚洲美女av黄| 最近2019中文免费高清视频观看www99| 亚洲黄页网在线观看| 成人网在线观看| 亚洲一级黄色片| 日韩美女主播视频| 国产精品国产三级国产aⅴ9色| 亚洲aaaaaa| 日本19禁啪啪免费观看www| 成人做爰www免费看视频网站| 国产亚洲精品成人av久久ww| 成人国产在线视频| 日韩激情在线视频| 国产精品激情自拍| 欧美另类极品videosbest最新版本| 欧美贵妇videos办公室| 精品久久久久久| 欧美一级大胆视频| 成人免费观看a| 色哟哟入口国产精品| 久久男人资源视频| 欧美一级淫片丝袜脚交| 爽爽爽爽爽爽爽成人免费观看| 精品福利一区二区| 亚洲成人网在线观看| 91精品国产电影| 欧美综合第一页| 国产一区二区日韩精品欧美精品| 国产成人avxxxxx在线看| 亚洲精品国产电影| 91高潮在线观看| 精品久久国产精品| 欧美专区日韩视频| 精品国产一区二区三区在线观看| 中文字幕欧美亚洲| 中文字幕欧美精品日韩中文字幕| 久热国产精品视频| 欧美二区在线播放| 91精品国产91久久久久福利| 日韩av影院在线观看| 成人av在线亚洲| 日韩精品中文在线观看| 亚洲精品自拍第一页| 国内精品一区二区三区| 亚洲国产成人久久综合| 中文字幕精品视频| 欧美激情综合亚洲一二区| 懂色aⅴ精品一区二区三区蜜月| 777国产偷窥盗摄精品视频| 国产成人精品在线观看| 成人欧美一区二区三区在线湿哒哒| 亚洲精品国偷自产在线99热| 日韩毛片中文字幕| 成人久久18免费网站图片| 成人妇女淫片aaaa视频| 亚洲xxxx妇黄裸体| 亚洲欧美视频在线| 国产精品麻豆va在线播放| 亚洲精品国产综合区久久久久久久| 亚洲福利在线观看| 色偷偷综合社区| 91免费视频网站| 亚洲xxxx18| 欧美xxxx综合视频| 992tv成人免费视频| 91最新在线免费观看| 日韩视频第一页| 久久精品国产清自在天天线| 欧美电影免费观看高清| 国产精品白丝jk喷水视频一区| 日韩精品久久久久| 欧美午夜丰满在线18影院| 国产欧美精品在线| 亚洲欧美日韩精品久久奇米色影视| 精品日韩美女的视频高清| 一区三区二区视频| 国产美女久久精品香蕉69| 欧美亚洲成人免费| 97涩涩爰在线观看亚洲| 久久精品色欧美aⅴ一区二区| 欧美日韩免费观看中文| 欧美电影免费观看高清完整| 5252色成人免费视频| 国产丝袜一区二区三区| 亚洲精品www久久久| 亚洲一区二区三区毛片| 日本一区二三区好的精华液| 亚洲天堂成人在线视频| 日韩中文字幕在线视频播放| 国产精品久久久久影院日本| 欧美日韩福利视频| 91精品国产综合久久久久久蜜臀| 成人写真福利网| 日韩精品视频观看| 亚洲美腿欧美激情另类| 国产精品视频一区二区高潮| 国产丝袜精品视频| 久久精品色欧美aⅴ一区二区| 欧美日韩一二三四五区| 成年无码av片在线| 精品日韩美女的视频高清| 欧美激情精品久久久久久变态| 亚洲天堂av综合网| 国产mv免费观看入口亚洲| 亚洲欧洲xxxx| 黑人巨大精品欧美一区二区| 久久久久久久久久久av| 国产极品jizzhd欧美| 国内精品视频在线|