Swift 可選型別(optional)與建構函式

2021-07-08 19:45:04 字數 2507 閱讀 1683

在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...