記錄下這個知識點:
一般我們在一下兩種情況會遇到 ? 和 !的使用
1,宣告變數時
var number:int?var str:string?
2,在對變數進行操作時
number?.hasvaluestr!.hasvalue
下面就上面兩種情況,簡單解釋下:
a,宣告變數時,如果不手動初始化,swift是不會自動初始化該變數為乙個預設值的,
如果不加?,在進入該頁面的時候,會報錯,錯誤提示就是有為初始化的變數,大家可以自己測驗下
例如:
var a: stringvar 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...