optional 可選值
optional是 swift 的一大特色,也是 swift 初學程式設計客棧者最容易困惑的問題。
定義變數時,如果指定該變數是可選的,表示該變數可以有乙個指定類www.cppcns.com型的值,也可以是 nil。
此外,swift的nil也和objective-c有些不一樣,在objective-c中,只有物件才能為nil,而在swift裡,當基礎型別(整形、浮點、布林等)沒有值時,也是nil,而不是乙個初始值,沒有初始值的值,是不能使用的,這就產生了optional型別。定義乙個optional的值很容易,只需要在型別後面加上問號(?)就行了,如:
var str: string?
乙個optional值和非optional值的區別就在於:optional值未經初始化雖然為nil,但普通變數連nil都沒有:
//未被初始化,但是是乙個optional型別,為nil
var str: string?
str //輸出nil
//未被初始化,也不是optional型別
var str2: string
str2 //使用時出錯
關於可選值 !和 ? 使用
先來看乙個栗子
class house klilrj
class person
let xiaowang = person()
//此時xiaowang沒有房子
//如果試圖呼叫xiaowang的house屬性,訪問house的numrooms屬性。過程如下:
//1. 第一種方式: 將house強行解包,用 !。但此時 house 沒有值,所以結果是直接崩潰的。
let numroom = xiaowang.house!.numrooms
//2. 用 if let
if let house = xiaowang.house
//3. 用 ?
if let numrooms = xiaowang.house?.numrooms
現在問題來了
這個涉及到乙個新的知識,叫可空鏈式呼叫。
可空鏈式呼叫。是指當呼叫可選乙個物件的屬性或方法時,可以直接使用問號,此時,不管它的屬性是否可選。最終都返回乙個該可選值。
可空鏈式呼叫
可空鏈式呼叫。是指當呼叫乙個 可選物件 的屬性和方法時。可以先不對該可選物件強行解包。直接使用?此時 可選 這個特徵,一直往後傳遞到 最後要呼叫的屬性和方法,最後返回乙個可選的值的過程。
還舉上面的例子。
if let numrooms = xiaowang.house?.numrooms
此時呼叫的是可選物件 house 的 numrooms屬性。滿足條件:
再舉個栗子
class r程式設計客棧oom
class house
class person
let windows = person().house?.room?.numwindows
if let w = windows
再說說呼叫可選物件的方法
調方法的原理是一樣的。
先說方法。在swift中任何方法都有返回值。沒有返回值,只是說它返回了void。void也是乙個返回值。
如果呼叫可選物件的某個方法。則可選物件的 可選特徵 會自動傳遞給該方法的返回值。
舉個栗子:
class room
}class house
}class person
let person = person()
//下面這一句,house 的可選特徵,傳給了 closedoor() 的返回值 void, 所以實際上返回的是乙個 可選的void型別
person.house?.closedoor()
//所以,判斷方法是否存在,可以判斷是否為 nil
if person.house?.closedoor() != nil
if person.house?.room?.closewindow() != nil
如果你不關心是否呼叫成功,則判斷是否程式設計客棧為nil那一步不是必須的
最後做個總結
來看專案當中的栗子
//先看呼叫屬性
class personcell: uitableviewcell
} override init(style: uitableviewcellstyle, reuseidentifier: string?)
required init?(coder adecoder: nscoder)
}//再看調方法
func tableview(tableview: uitableview, didselectrowatindexpath indexpath: nsindexpath)
//此處, n**igationcontroller是乙個可選屬性,則 pushviewcontroller 方法返回乙個可選的void。n**igationcontroller?.pushviewcontroller(detailvc, animated: true)
} //要想判斷 pushviewcontroller 是否成功,可以做下面的活
if n**igationcontroller?.pushviewcontroller(detailvc, animated: true) != nil
總結本文標題: swift中可選值?和!使用的方法示例
本文位址:
swift中的可選型別
可選型別也是swift語言新新增的物件。主要是為了解決物件變數或常量為空的情況。在前面定義的變數和常量都不能為空。裡面必須要有值。swift中的可選型別則允許變數 常量 中沒有值 被設為nil 要注意的是,swift中的nil和oc中的nil不一樣。前者的nil表示沒有值,而後者的nil表示變數值為...
重新認識Swift中的可選型 Swift2 1
playground noun a place where people can play import uikit swift中nil代表是是另外一種型別,而不像oc那樣,任何物件都能賦值為nil,swift中的nil就是空,什麼都沒有的意思,當乙個變數有可能存在空值的時候,必須顯式的申明為可選型...
Swift 中的值型別和引用型別
值型別和引用型別只在之前的面試過程中碰到過,最近學習過程中,在體驗 swift 的物件導向特性的時候,在 struct 和 class 中再次碰到了這個問題,說一說自己的收穫吧。值型別和引用型別在 oc 裡面理解起來應該更方便。在 oc 中,我們例項化物件的時候有兩種方式。一種是需要在變數名前面加個...