欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

Optional 可選值

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

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

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

var str: String?

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

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

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

先來(lái)看一個(gè)栗子

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

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

let xiaowang = Person()
//此時(shí)xiaowang沒(méi)有房子
//如果試圖調(diào)用xiaowang的house屬性,訪問(wèn)house的numRooms屬性。過(guò)程如下:
//1. 第一種方式: 將house強(qiáng)行解包,用 !。但此時(shí) house 沒(méi)有值,所以結(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)在問(wèn)題來(lái)了

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

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

可空鏈?zhǔn)秸{(diào)用。是指當(dāng)調(diào)用可選一個(gè)對(duì)象的屬性或方法時(shí),可以直接使用問(wèn)號(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è)可選的值的過(guò)程。

還舉上面的例子。

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

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

  • 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è)人可能有房子也可能沒(méi)有房子,所以將房子的屬性設(shè)為可選
 var house: House?
}

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

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

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

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

先說(shuō)方法。在swift中任何方法都有返回值。沒(méi)有返回值,只是說(shuō)它返回了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)門(mén)")
 }
}

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

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

//所以,判斷方法是否存在,可以判斷是否為 nil
if person.house?.closeDoor() != nil {
 //closeDoor關(guān)門(mén)的方法調(diào)用成功了
} 

if person.house?.room?.closeWindow() != nil {
 //closeWindow 關(guān)窗的方法調(diào)用成功了
}

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

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

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

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

//先看調(diào)用屬性
class PersonCell: UITableViewCell {

 var person: Person? {
 didSet {
  //此兩處,person是可選的。訪問(wèn)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é)

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

相關(guān)文章

  • swift如何利用系統(tǒng)庫(kù)將漢字轉(zhuǎn)換為拼音詳解

    swift如何利用系統(tǒng)庫(kù)將漢字轉(zhuǎn)換為拼音詳解

    將漢字轉(zhuǎn)換為拼音更利于我們大家開(kāi)發(fā)搜索功能,所以這篇文章主要給大家介紹了關(guān)于swift如何利用系統(tǒng)庫(kù)將漢字轉(zhuǎn)換為拼音的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • Swift?Package?技巧及混編兼容問(wèn)題詳解

    Swift?Package?技巧及混編兼容問(wèn)題詳解

    這篇文章主要為大家介紹了Swift?Package?技巧及混編兼容問(wèn)題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Swift?重構(gòu)重載運(yùn)算符示例解析

    Swift?重構(gòu)重載運(yùn)算符示例解析

    這篇文章主要為大家介紹了Swift?重構(gòu)重載運(yùn)算符示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Swift中的Access Control權(quán)限控制介紹

    Swift中的Access Control權(quán)限控制介紹

    這篇文章主要介紹了Swift中的Access Control權(quán)限控制介紹,本文講解了private、internal、public三個(gè)關(guān)鍵字的使用,需要的朋友可以參考下
    2015-05-05
  • Swift的函數(shù)式編程詳解

    Swift的函數(shù)式編程詳解

    這篇文章主要介紹了Swift的函數(shù)式編程詳解,本文講解了Swift概覽、Swift遞歸、Swift 的高階函數(shù)和閉包等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Swift如何使用類(lèi)型擦除及自定義詳解

    Swift如何使用類(lèi)型擦除及自定義詳解

    有很多地方會(huì)用到類(lèi)型擦除,并且它們的作用的各不相同。下面這篇文章主要給大家介紹了關(guān)于Swift如何使用類(lèi)型擦除及自定義的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-10-10
  • Swift枚舉的一些小用法總結(jié)

    Swift枚舉的一些小用法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Swift枚舉的一些小用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • swift3.0鍵盤(pán)彈起遮擋輸入框問(wèn)題的解決方案

    swift3.0鍵盤(pán)彈起遮擋輸入框問(wèn)題的解決方案

    這篇文章主要介紹了swift3.0鍵盤(pán)彈起遮擋輸入框問(wèn)題的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • Swift操作Quartz 2D進(jìn)行簡(jiǎn)單的繪圖與坐標(biāo)變換的教程

    Swift操作Quartz 2D進(jìn)行簡(jiǎn)單的繪圖與坐標(biāo)變換的教程

    這篇文章主要介紹了Swift操作Quartz 2D進(jìn)行簡(jiǎn)單的繪圖與坐標(biāo)變換的教程,Quartz 2D是Core Graphics框架中的一個(gè)重要組件,經(jīng)常被Mac OS或和iOS開(kāi)發(fā)者用來(lái)繪圖,需要的朋友可以參考下
    2016-04-04
  • 深入探究Swift枚舉關(guān)聯(lián)值的內(nèi)存

    深入探究Swift枚舉關(guān)聯(lián)值的內(nèi)存

    這篇文章主要給大家介紹了關(guān)于Swift枚舉關(guān)聯(lián)值的內(nèi)存的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論