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

首頁 > 編程 > Swift > 正文

swift中可選值?和!使用的方法示例

2020-03-09 17:43:39
字體:
來源:轉載
供稿:網友

Optional 可選值

Optional是 Swift 的一大特色,也是 Swift 初學者最容易困惑的問題。

定義變量時,如果指定該變量是可選的,表示該變量可以有一個指定類型的值,也可以是 nil。

此外,Swift的nil也和Objective-C有些不一樣,在Objective-C中,只有對象才能為nil,而在Swift里,當基礎類型(整形、浮點、布爾等)沒有值時,也是nil,而不是一個初始值,沒有初始值的值,是不能使用的,這就產生了Optional類型。定義一個Optional的值很容易,只需要在類型后面加上問號(?)就行了,如:

var str: String?

一個Optional值和非Optional值的區別就在于:Optional值未經初始化雖然為nil,但普通變量連nil都沒有:

//未被初始化,但是是一個Optional類型,為nilvar str: String?str //輸出nil//未被初始化,也不是Optional類型var str2: Stringstr2  //使用時出錯

關于可選值 !和 ? 使用

先來看一個栗子

class House { //房子有幾個房間 var numRooms:Int = 5}class Person { //一個人可能有房子也可能沒有房子,所以將房子的屬性設為可選 var house: House?}let xiaowang = Person()//此時xiaowang沒有房子//如果試圖調用xiaowang的house屬性,訪問house的numRooms屬性。過程如下://1. 第一種方式: 將house強行解包,用 !。但此時 house 沒有值,所以結果是直接崩潰的。let numroom = xiaowang.house!.numRooms//2. 用 if letif let house = xiaowang.house { let roomCount = house.numRooms}//3. 用 ?if let numRooms = xiaowang.house?.numRooms { let numroom = numRooms}

現在問題來了

  1. house后面怎么可以直接接問號呢?不是接了問號編譯器就知道它是否有值會報錯嗎?
  2. house的numRooms屬性不是必選屬性嗎? 為什么用if let來做可選綁定了呢?

這個涉及到一個新的知識,叫可空鏈式調用。

可空鏈式調用。是指當調用可選一個對象的屬性或方法時,可以直接使用問號,此時,不管它的屬性是否可選。最終都返回一個該可選值。

可空鏈式調用

可空鏈式調用。是指當調用一個 可選對象 的屬性和方法時??梢韵炔粚υ摽蛇x對象強行解包。直接使用?此時 可選 這個特征,一直往后傳遞到 最后要調用的屬性和方法,最后返回一個可選的值的過程。

還舉上面的例子。

if let numRooms = xiaowang.house?.numRooms { let numroom = numRooms}

此時調用的是可選對象 house 的 numRooms屬性。滿足條件:

  • house是可選對象
  • 調用可選對象 house 的屬性 numRooms
  • 此時不用給可選對象 house 強行解包
  • 可選這個特征,傳遞給了 numRooms
  • 所以,返回一個numRooms 的可選值。

再舉個栗子

class Room { //房間有四個窗子 var numWindows:Int = 4}class House { //房子有幾個房間 var room: Room?}class Person { //一個人可能有房子也可能沒有房子,所以將房子的屬性設為可選 var house: House?}let windows = Person().house?.room?.numWindowsif let w = windows { //windows是可選值}
  1. 訪問了一個 可選對象 house的屬性Room
  2. 那么 house 不用強行解包,不用管Room之前是否可選,此時可選的特征傳給了Room,那么Room也變成了可選。
  3. 再訪問可選對象 Room 的 numWindows屬性,此時可選特征傳遞給 numWindows。
  4. 返回一個可選的 numWindows. 此時 windows 是可選的。

再說說調用可選對象的方法

調方法的原理是一樣的。

先說方法。在swift中任何方法都有返回值。沒有返回值,只是說它返回了Void。Void也是一個返回值。
如果調用可選對象的某個方法。則可選對象的 可選特征 會自動傳遞給該方法的返回值。

舉個栗子:

class Room { //房間有四個窗子 var numWindows:Int = 4 func closeWindow() { print("關窗") }}class House { //房子有幾個房間 var room: Room? func closeDoor() { print("關門") }}class Person { //一個人可能有房子也可能沒有房子,所以將房子的屬性設為可選 var house: House?}let person = Person()//下面這一句,house 的可選特征,傳給了 closeDoor() 的返回值 Void, 所以實際上返回的是一個 可選的Void類型person.house?.closeDoor()//所以,判斷方法是否存在,可以判斷是否為 nilif person.house?.closeDoor() != nil { //closeDoor關門的方法調用成功了} if person.house?.room?.closeWindow() != nil { //closeWindow 關窗的方法調用成功了}

如果你不關心是否調用成功,則判斷是否為nil那一步不是必須的

最后做個總結

  • 訪問可選對象的屬性或方法時,可以用 ? 號
  • 訪問可選對象的屬性時,從 ?后面都變可選了,返回的一定是一個可選值。
  • 訪問可選對象的方法時。判斷是否為 nil 來確認方法是否并調用成功。

來看項目當中的栗子

//先看調用屬性class PersonCell: UITableViewCell { var person: Person? { didSet {  //此兩處,person是可選的。訪問person的屬性用?,返回的是一個可選的 name  textLabel?.text = person?.name  detailTextLabel?.text = person?.phone } } override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: .Subtitle, reuseIdentifier: reuseIdentifier) accessoryType = .DisclosureIndicator } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }}//再看調方法 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let detailVC = DetailViewController() detailVC.person = persons[indexPath.row] detailVC.finishedCallBack = {  self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Top) }//此處, navigationController是一個可選屬性,則 pushViewController 方法返回一個可選的Void。navigationController?.pushViewController(detailVC, animated: true) } //要想判斷 pushViewController 是否成功,可以做下面的活 if navigationController?.pushViewController(detailVC, animated: true) != nil { //推成功了}

總結

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


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视屏在线播放| 日韩欧美999| 狠狠色噜噜狠狠狠狠97| 亚洲一区中文字幕| 亚洲国产精品成人av| 尤物99国产成人精品视频| 国产精品入口免费视| 国产美女久久久| 国产在线视频不卡| 日韩av免费看网站| 欧美黄网免费在线观看| 中文字幕精品影院| 久久全国免费视频| 一二美女精品欧洲| 在线播放国产一区中文字幕剧情欧美| 最新亚洲国产精品| 欧美激情奇米色| 亚洲国产精品小视频| 在线播放亚洲激情| 日韩亚洲在线观看| 青青在线视频一区二区三区| 日本sm极度另类视频| 国产成人精品电影久久久| 日韩成人中文字幕在线观看| 欧美激情精品久久久久久变态| 久久精品国产69国产精品亚洲| 久久精品青青大伊人av| 亚洲精品久久久久国产| 久久综合亚洲社区| 中文字幕久久久| 亚洲二区中文字幕| 国产精品爽爽爽| 亚洲久久久久久久久久| 亚洲欧美国产va在线影院| 国产亚洲aⅴaaaaaa毛片| 亚洲欧洲美洲在线综合| 2019中文字幕免费视频| 久久亚洲精品网站| 亚洲一区精品电影| 成人免费视频97| 国产一级揄自揄精品视频| 亚洲欧美国产日韩天堂区| 久99九色视频在线观看| 亚洲乱码av中文一区二区| 国产免费一区视频观看免费| 亚洲第一精品夜夜躁人人躁| 黄色精品一区二区| 久久久精品影院| 久久在线免费视频| 久久九九国产精品怡红院| 久久久国产精品一区| 亚洲国产精品系列| 91国自产精品中文字幕亚洲| 国产精品久久久久77777| 成人午夜小视频| 日本精品视频在线观看| 91久久久久久久久久久久久| 91日本在线视频| 亚洲护士老师的毛茸茸最新章节| 日韩一区二区av| 91久久嫩草影院一区二区| 国产91av在线| 欧美国产日韩免费| 精品露脸国产偷人在视频| 欧美一级免费看| 欧美性xxxx| 成人亲热视频网站| 不卡av在线网站| 国产不卡一区二区在线播放| 欧美精品videossex88| 久久久人成影片一区二区三区观看| 疯狂蹂躏欧美一区二区精品| 欧美日本啪啪无遮挡网站| 国产成人福利夜色影视| 揄拍成人国产精品视频| www.欧美精品一二三区| 国产欧美欧洲在线观看| 国产午夜精品全部视频在线播放| 亚洲电影免费观看高清完整版在线| 夜夜嗨av一区二区三区四区| 日韩欧美中文第一页| 97超碰国产精品女人人人爽| 日韩精品亚洲视频| 热久久美女精品天天吊色| 日韩视频中文字幕| 91美女高潮出水| 一区二区三区 在线观看视| 高跟丝袜一区二区三区| 欧美精品在线观看| 亚洲大胆人体在线| 欧美激情在线观看视频| 亚洲欧美精品中文字幕在线| 午夜免费日韩视频| 91精品国产免费久久久久久| 国产精品男人爽免费视频1| 福利视频导航一区| 欧美日韩免费区域视频在线观看| 毛片精品免费在线观看| 91在线免费看网站| 欧洲亚洲妇女av| 国产精品美女无圣光视频| 日韩av在线一区二区| 91久久精品国产91久久性色| 成人国产亚洲精品a区天堂华泰| 91禁外国网站| 久久精品2019中文字幕| 日韩欧美亚洲国产一区| 精品久久久精品| 91久久久久久国产精品| 91性高湖久久久久久久久_久久99| 欧美伊久线香蕉线新在线| 中文字幕成人精品久久不卡| 粉嫩av一区二区三区免费野| 日韩电影在线观看中文字幕| 欧美高清激情视频| 亚洲精品国产免费| 91久久久久久久久久久| 日韩成人在线观看| 欧美成人一二三| 亚洲最新视频在线| 夜夜嗨av一区二区三区免费区| 国产精品久久久久久久久久久久久久| 97在线视频观看| 欧美夫妻性生活视频| 亚洲欧洲日本专区| 亚洲小视频在线观看| 欧美在线一区二区视频| 久久97久久97精品免视看| 夜夜嗨av一区二区三区四区| 中文字幕免费国产精品| 美女999久久久精品视频| 91在线视频一区| 国产成人精品免高潮费视频| 日韩美女在线观看一区| 国产精品成人一区| 黑人巨大精品欧美一区二区三区| 欧美亚洲国产成人精品| 538国产精品视频一区二区| 亚洲在线第一页| 日韩国产精品亚洲а∨天堂免| 亚洲偷欧美偷国内偷| 在线观看亚洲视频| 国内成人精品视频| 欧美性少妇18aaaa视频| 亚洲一区二区三区xxx视频| 亚洲欧美中文日韩v在线观看| 久久久国产成人精品| 国产精品日韩久久久久| 国内精品伊人久久| 国模叶桐国产精品一区| 亚洲精品视频网上网址在线观看| xvideos亚洲人网站| 97超碰蝌蚪网人人做人人爽| 中文字幕一区二区三区电影| 久久精品99久久久久久久久| 色妞欧美日韩在线| 97视频在线观看免费| 九九热精品视频| 亚洲国产精品资源| 亚洲精品97久久| 久久久久成人网| 欧美丝袜美女中出在线| 国产欧美精品一区二区| 中文在线不卡视频|