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

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

 更新時間:2017年11月15日 09:28:10   作者:鴻毅  
這篇文章主要給大家介紹了關(guān)于swift中可選值?和!使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

Optional 可選值

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

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

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

var str: String?

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

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

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

先來看一個栗子

class House {
 //房子有幾個房間
 var numRooms:Int = 5
}

class Person {
 //一個人可能有房子也可能沒有房子,所以將房子的屬性設(shè)為可選
 var house: House?
}

let xiaowang = Person()
//此時xiaowang沒有房子
//如果試圖調(diào)用xiaowang的house屬性,訪問house的numRooms屬性。過程如下:
//1. 第一種方式: 將house強行解包,用 !。但此時 house 沒有值,所以結(jié)果是直接崩潰的。
let numroom = xiaowang.house!.numRooms

//2. 用 if let
if let house = xiaowang.house {
 let roomCount = house.numRooms
}

//3. 用 ?
if let numRooms = xiaowang.house?.numRooms {
 let numroom = numRooms
}

現(xiàn)在問題來了

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

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

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

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

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

還舉上面的例子。

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

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

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

再舉個栗子

class Room {
 //房間有四個窗子
 var numWindows:Int = 4
}

class House {
 //房子有幾個房間
 var room: Room?
}

class Person {
 //一個人可能有房子也可能沒有房子,所以將房子的屬性設(shè)為可選
 var house: House?
}

let windows = Person().house?.room?.numWindows

if let w = windows {
 //windows是可選值
}
  1. 訪問了一個 可選對象 house的屬性Room
  2. 那么 house 不用強行解包,不用管Room之前是否可選,此時可選的特征傳給了Room,那么Room也變成了可選。
  3. 再訪問可選對象 Room 的 numWindows屬性,此時可選特征傳遞給 numWindows。
  4. 返回一個可選的 numWindows. 此時 windows 是可選的。

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

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

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

舉個栗子:

class Room {
 //房間有四個窗子
 var numWindows:Int = 4

 func closeWindow() {
 print("關(guān)窗")
 }
}

class House {
 //房子有幾個房間
 var room: Room?

 func closeDoor() {
 print("關(guān)門")
 }
}

class Person {
 //一個人可能有房子也可能沒有房子,所以將房子的屬性設(shè)為可選
 var house: House?
}

let person = Person()
//下面這一句,house 的可選特征,傳給了 closeDoor() 的返回值 Void, 所以實際上返回的是一個 可選的Void類型
person.house?.closeDoor()

//所以,判斷方法是否存在,可以判斷是否為 nil
if 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那一步不是必須的

最后做個總結(jié)

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

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

//先看調(diào)用屬性
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")
 }
}

//再看調(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是一個可選屬性,則 pushViewController 方法返回一個可選的Void。navigationController?.pushViewController(detailVC, animated: true)
 }

 //要想判斷 pushViewController 是否成功,可以做下面的活
 if navigationController?.pushViewController(detailVC, animated: true) != nil {
 //推成功了
}

總結(jié)

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

相關(guān)文章

  • SwiftUI 登錄界面布局實現(xiàn)示例詳解

    SwiftUI 登錄界面布局實現(xiàn)示例詳解

    這篇文章主要為大家介紹了SwiftUI 登錄界面布局實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Swift免費短信驗證碼實現(xiàn)及動態(tài)倒計時功能

    Swift免費短信驗證碼實現(xiàn)及動態(tài)倒計時功能

    這篇文章主要介紹了Swift免費短信驗證碼實現(xiàn)及動態(tài)倒計時功能的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • Swift心得筆記之字符串

    Swift心得筆記之字符串

    Swift 的 String 類型是值類型 。 如果您創(chuàng)建了一個新的字符串,那么當(dāng)其進行常量、變量賦值操作或在函數(shù)/方法中傳遞時,會進行值拷貝。 任何情況下,都會對已有字符串值創(chuàng)建新副本,并對該新副本進行傳遞或賦值操作。
    2015-04-04
  • 在Swift中使用Cocoa的現(xiàn)有設(shè)計模式介紹

    在Swift中使用Cocoa的現(xiàn)有設(shè)計模式介紹

    這篇文章主要介紹了在Swift中使用Cocoa的現(xiàn)有設(shè)計模式介紹,Cocoa是蘋果公司為Mac OS X所創(chuàng)建的原生面向?qū)ο蟮腁PI,是Mac OS X上五大API之一,需要的朋友可以參考下
    2014-07-07
  • Swift中添加雙擊手勢識別器

    Swift中添加雙擊手勢識別器

    在這次IOS應(yīng)用開發(fā)教程中,我們打算實現(xiàn)手勢識別。正如你所知道的,IOS支持大量的手勢操作,它們能提供了很好的應(yīng)用控制和出色用戶體驗。
    2019-08-08
  • Swift中非可選的可選值類型處理方法詳解

    Swift中非可選的可選值類型處理方法詳解

    Optional是Objective-C沒有的數(shù)據(jù)類型,是蘋果引入到Swift語言中的全新類型,它的特點就和它的名字一樣:可以有值,也可以沒有值,當(dāng)它沒有值時,就是nil。下面這篇文章主要給大家介紹了關(guān)于Swift中非可選的可選值類型處理方法的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • 深入理解swift變量和函數(shù)

    深入理解swift變量和函數(shù)

    Swift 函數(shù)用來完成特定任務(wù)的獨立的代碼塊。這篇文章主要介紹了swift變量和函數(shù)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • 在?Swift?中編寫Git?Hooks腳本的方法

    在?Swift?中編寫Git?Hooks腳本的方法

    在本例中,我使用了?commit-msg?鉤子,它能夠在當(dāng)前提交信息生效前修改此信息,鉤子由一個參數(shù)調(diào)用,該參數(shù)是指向包含用戶輸入的提交消息的文件的路徑,這意味著,為了改變提交消息,我們只需要從文件中讀取、修改其內(nèi)容,然后寫回調(diào)用掛鉤的文件
    2022-06-06
  • Swift?Package?技巧及混編兼容問題詳解

    Swift?Package?技巧及混編兼容問題詳解

    這篇文章主要為大家介紹了Swift?Package?技巧及混編兼容問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Swift仿選擇電影票的效果并實現(xiàn)無限/自動輪播的方法

    Swift仿選擇電影票的效果并實現(xiàn)無限/自動輪播的方法

    這篇文章主要給大家介紹了關(guān)于Swift仿選擇電影票的效果并實現(xiàn)無限/自動輪播的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08

最新評論

阳曲县| 于都县| 沙湾县| 星座| 吉安县| 根河市| 突泉县| 乌鲁木齐县| 且末县| 班戈县| 阳东县| 洪雅县| 石城县| 阿拉尔市| 吉木萨尔县| 南召县| 张家川| 琼结县| 灌云县| 汝阳县| 莱西市| 阿克| 齐齐哈尔市| 安阳县| 东光县| 嘉善县| 黔东| 留坝县| 康保县| 商水县| 太原市| 清苑县| 咸宁市| 夏邑县| 新昌县| 启东市| 安吉县| 武强县| 阿鲁科尔沁旗| 广灵县| 平泉县|