麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:43:39
字體:
供稿:網(wǎng)友

Optional 可選值

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

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

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

var str: String?

一個(gè)Optional值和非Optional值的區(qū)別就在于:Optional值未經(jīng)初始化雖然為nil,但普通變量連nil都沒有:

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

關(guān)于可選值 !和 ? 使用

先來看一個(gè)栗子

class House { //房子有幾個(gè)房間 var numRooms:Int = 5}class Person { //一個(gè)人可能有房子也可能沒有房子,所以將房子的屬性設(shè)為可選 var house: House?}let xiaowang = Person()//此時(shí)xiaowang沒有房子//如果試圖調(diào)用xiaowang的house屬性,訪問house的numRooms屬性。過程如下://1. 第一種方式: 將house強(qiáng)行解包,用 !。但此時(shí) house 沒有值,所以結(jié)果是直接崩潰的。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}

現(xiàn)在問題來了

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

這個(gè)涉及到一個(gè)新的知識(shí),叫可空鏈?zhǔn)秸{(diào)用。

可空鏈?zhǔn)秸{(diào)用。是指當(dāng)調(diào)用可選一個(gè)對(duì)象的屬性或方法時(shí),可以直接使用問號(hào),此時(shí),不管它的屬性是否可選。最終都返回一個(gè)該可選值。

可空鏈?zhǔn)秸{(diào)用

可空鏈?zhǔn)秸{(diào)用。是指當(dāng)調(diào)用一個(gè) 可選對(duì)象 的屬性和方法時(shí)??梢韵炔粚?duì)該可選對(duì)象強(qiáng)行解包。直接使用?此時(shí) 可選 這個(gè)特征,一直往后傳遞到 最后要調(diào)用的屬性和方法,最后返回一個(gè)可選的值的過程。

還舉上面的例子。

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

此時(shí)調(diào)用的是可選對(duì)象 house 的 numRooms屬性。滿足條件:

  • house是可選對(duì)象
  • 調(diào)用可選對(duì)象 house 的屬性 numRooms
  • 此時(shí)不用給可選對(duì)象 house 強(qiáng)行解包
  • 可選這個(gè)特征,傳遞給了 numRooms
  • 所以,返回一個(gè)numRooms 的可選值。

再舉個(gè)栗子

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

再說說調(diào)用可選對(duì)象的方法

調(diào)方法的原理是一樣的。

先說方法。在swift中任何方法都有返回值。沒有返回值,只是說它返回了Void。Void也是一個(gè)返回值。
如果調(diào)用可選對(duì)象的某個(gè)方法。則可選對(duì)象的 可選特征 會(huì)自動(dòng)傳遞給該方法的返回值。

舉個(gè)栗子:

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

如果你不關(guān)心是否調(diào)用成功,則判斷是否為nil那一步不是必須的

最后做個(gè)總結(jié)

  • 訪問可選對(duì)象的屬性或方法時(shí),可以用 ? 號(hào)
  • 訪問可選對(duì)象的屬性時(shí),從 ?后面都變可選了,返回的一定是一個(gè)可選值。
  • 訪問可選對(duì)象的方法時(shí)。判斷是否為 nil 來確認(rèn)方法是否并調(diào)用成功。

來看項(xiàng)目當(dāng)中的栗子

//先看調(diào)用屬性class PersonCell: UITableViewCell { var person: Person? { didSet {  //此兩處,person是可選的。訪問person的屬性用?,返回的是一個(gè)可選的 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") }}//再看調(diào)方法 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let detailVC = DetailViewController() detailVC.person = persons[indexPath.row] detailVC.finishedCallBack = {  self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Top) }//此處, navigationController是一個(gè)可選屬性,則 pushViewController 方法返回一個(gè)可選的Void。navigationController?.pushViewController(detailVC, animated: true) } //要想判斷 pushViewController 是否成功,可以做下面的活 if navigationController?.pushViewController(detailVC, animated: true) != nil { //推成功了}

總結(jié)

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: av免费在线观 | 老师你怎么会在这第2季出现 | 中文字幕在线免费播放 | 国产91丝袜在线播放 | 日本高清在线免费 | 九九热免费观看 | 国产在线精品一区二区 | 中文字幕在线一 | 91精品欧美一区二区三区 | 97久久精品一区二区三区观看 | 久草在线免费资源站 | 草b视频在线观看 | 成人毛片100部免费观看 | 亚洲精品久久久久久 | 精品亚洲一 | 久久久久久久免费精品 | 国产亚洲精品久久久久婷婷瑜伽 | 成人福利视频导航 | 日韩激情在线视频 | 黄色网电影 | 91成人影库 | 欧美视频国产 | 一区二区网| 色戒在线版 | lutube成人福利在线观看污 | 一级电影在线免费观看 | 蜜桃传媒视频麻豆第一区免费观看 | 国产精品欧美久久久久一区二区 | 天堂在线中文资源 | 欧美日韩专区国产精品 | 国产精品久久久久久久久久三级 | 欧美性受xxxx人人本视频 | 久久久久久久91 | 蜜桃视频在线免费观看 | 日韩激情 | 久久不雅视频 | 青青青在线免费 | 亚洲精品3| 91精品国产99久久久久久 | 国产日韩一区二区三区在线观看 | 欧美性猛交xxx乱大交3蜜桃 |