在swift快速入門時,發現自己很難理解可選型別可選型別是swift中特有的,c和objective-c中都沒有這個概念。所以本文通過一些類的互相呼叫來加強對可選型別的理解
本文涉及的內容有 類,建構函式,可選型別的定義和使用
當你定義乙個型別為可選型別時,它可以為nil,或者可以乙個值
//申明乙個可選型字串,未初始化預設為nil
var optionstr: string?
//申明乙個可選性int常量,無初始化
let num: int?
我們做個實驗,令num = 1,再num = 2,結果如下圖。
我們可以看到,在第一次 num = 1,其實是對num進行初始化,所以並不會報錯。
而當第二次賦值時,則系統提示錯誤,說常量num只能初始化一次。
總結
如果申明的是var 可選型變數,則初始化的值為nil
如果申明的是let 可選型常量,則第一次賦值操作為初始化,並不會自動初始化為nil
強制型別轉換時,如int()操作,不是所有的string都可以轉換為int,所以在這時候就體現的可選型的作用,要麼返回int,要麼返回nil
//converednumber和converednum被推測為型別"int?"
let possiblenumber = "123"
let convertednumber = int(possiblenumber)
let possiblenum = "hello"
let convertednum = int(possiblenum)
先定義乙個room類
class room
}
我們嘗試一下一些錯誤的定義:
1. 如果在類中申明例項變數,則必須有建構函式或者在申明變數時對其進行初始化,而可選型的變數是可以不初始化的,因為系統會將其初始化為nil
2. 如果在類中申明常量,則不管是否是可選型,都必須初始化,因為常量是沒有辦法修改其值的,所以必須初始化
再定義乙個residence類,person類
class
person
class
residence
subscript(i: int) -> room
set(newvalue)
}func printnumberofrooms()
}
然後申請乙個person例項john, 當呼叫例項方法時出錯
原因在於,我們在person中申明的是residence?類,此處呼叫時
//要麼使用
let roomcount = john.residence?.numberofrooms
//要麼使用
let roomcount = john.residence!.numberofrooms
型別type?和型別type!中符號的意思
?: 告訴編譯器我不確定這個變數是否有值,有值就繼續呼叫,否則返回nil
!: 告訴編譯器這個變數是肯定有值的,否則報錯
我們再嘗試一下別的錯誤
這裡的原因是我們person類中申明residence?時沒有初始化,所以預設初始化為nil,而此處用!來解析繫結,就會導致錯誤
我們可以在person類中對residence進行初始化
class
person
}
由於初始化後,residence的值不再為空,則呼叫john.residence!就不會出錯
此問題來自swift裡!號的意義
樓主的的問題是不明白為什麼有時候用!,有時候用?
var amitelbl: uilabel?
self.amitelbl = uilable(frame:cgrectmake(50, 100, 200, 40))
self.amitelbl!.text = "i love mixbox"
self.view?.addsubview(self.amitelbl)
我們分析一下
1.首先我們定義乙個uilable?,然後對其進行初始化
2.此時self.amitelbl!.text的原因是我們對amitelbl進行了初始化,我們確定其值不為空,所以使用了!
3.而self.view?為什麼用的是?呢,因為我們不確定view是否為空,如果此時貿然使用!,當view為nil時,程式就會崩潰。
4.我們也可以翻譯一下self.view?.addsubview(self.amitelbl)
if let theview = self.view else
參考:
蘋果官方文件
Swift 可選型別
swift 可選型別 optionals 可選型別 強制解析 自動解析 可選繫結 1.可選型別 加入我們建立乙個變數,但是它有可能為空,這時候swift提供乙個符號 來表示這是乙個可能為空的變數 var thisstr string?看到這裡的if,沒錯,if或者for迴圈後面的內容不加 加了也沒錯...
Swift 可選型別
在 swift 中,可選型別用來處理值可能缺失的情況,表示下面兩種情況 在 swift 中宣告變數時,使用?或 來表示宣告的變數是可選型別。let name string?var age int 此時,變數name和age預設都是nil,表示空。而?和 的區別在於使用前者宣告的變數所包含的值時,需要...
swift可選隱式可選型別
可選型別 隱式可選型別 在swift中,可選魯迅個其實是乙個,列舉型別,裡面有none和some兩種型別。其實所謂的nil就是optional.none,非nil就是optional.some,然後會通過some t 包裝 wrap 原始值,這也是為什麼可選型別需要拆包的原因,也是playgroun...