swift開發之 ? 和 ! 的作用

2022-05-15 10:12:20 字數 1908 閱讀 9132

記錄下這個知識點:

一般我們在一下兩種情況會遇到 ? 和 !的使用

1,宣告變數時

var number:int?var str:string?

2,在對變數進行操作時

number?.hasvalue

str!.hasvalue

下面就上面兩種情況,簡單解釋下:

a,宣告變數時,如果不手動初始化,swift是不會自動初始化該變數為乙個預設值的,

如果不加?,在進入該頁面的時候,會報錯,錯誤提示就是有為初始化的變數,大家可以自己測驗下

例如:

var a: string 

var b = a //

error :因為沒有初始化a,a沒有值

但是對於optional的變數則不同,optional的變數在宣告時如果不初始化,swift會自動將該變數初始化為nil。宣告變數時在型別後新增?或者!,就是告訴編譯器

加上?,例如:

var a: string?                                   //

a 為nil

var b: string? //

b 為nil

var a_test = a //

a_test 為nil

var b_test = b //

b_test 為nil

簡而言之就是加上 ? 就是變數初始化的時候自動nil,如果不加,swift自動視為沒有初始化,報錯

optional事實上是乙個列舉型別,從下圖可以看出,optional包含none和some兩種型別,而nil就是optional.none,非nil就是optional.some。如果optional變數在宣告時不初始化,swift會呼叫init()來初始化變數為nil,而用非nil的值初始化變數時,會通過some(t)把該原始值包裝,所以在之後使用的時候我們需要通過解包取出原始值才能使用。

b,對變數進行操作時

var arraycount = datalist?.count

這時問號的意思類似於isresponsetoselector,即如果變數是nil,則不能響應後面的方法,所以會直接返回nil。如果變數非nil,就會拆some(t)的包,取出原始值執行後面的操作。

var arraycount = datalist!.count

這裡的嘆號和之前的問號則不同,這裡表示我確定datalist一定是非nil的,所以直接拆包取出原始值進行處理。因此此處如果不小心讓datalist為nil,程式就會crash掉。

回到上面宣告時?和!區別的問題上去

宣告變數時的?只是單純的告訴swift這是optional的,如果沒有初始化就預設為nil,而通過!宣告,則之後對該變數操作的時候都會隱式的在操作前新增乙個!。

可選型別說明:

可選型別是swift乙個特色,它表示乙個變數有可能有值,也可能沒有值(nil)

宣告方式是「資料型別+問號」

而當腰使用乙個可選型別的變數時,要在後面加感嘆號!;

總結

問號?a.宣告時新增?,告訴編譯器這個是optional的,如果宣告時沒有手動初始化,就自動初始化為nil

b.在對變數值操作前新增?,判斷如果變數時nil,則不響應後面的方法。

嘆號!a.宣告時新增!,告訴編譯器這個是optional的,並且之後對該變數操作的時候,都隱式的在操作前新增!

b.在對變數操作前新增!,表示預設為非nil,直接解包進行處理

swift演算法 三數之和

描述 給定乙個包含n個整數的陣列nums,判斷nums中是否存在三個元素a,b,c,使得a b c 0 找出所有滿足條件且不重複的三元組 注意 答案中不可以包含重複的三元組 例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元集合為 1,0,1 1,1,2 一 暴力法 思路 陣列先從小到大...

Swift開發教程 Swift的基本語法

下面來介紹swift的基本用法 println hello,world println 你好,世界!定義乙個常量,使用關鍵字 let 在swift中,幾乎對所有的基本資料型別或者是物件型別使用結構體進行了重寫 let haidian 海淀 let haidian string 海淀 在swift中,...

Swift開發基礎

import uikit extension double class viewcontroller uiviewcontroller else let m 20 if m 20 字元 字串定義 var charvalue1 character a 這是乙個字元 var strvalue1 stri...