Swift 學習之二十一 ?和 !(詳解)

2021-06-28 14:24:16 字數 2771 閱讀 1710

swift語言使用var定義變數,但和別的語言不同,swift裡不會自動給變數賦初始值,

也就是說變數不會有預設值,所以要求使用變數之前必須要對其初始化

。如果在使用變數之前不進行初始化就會報錯:

[plain]view plain

copy

print

?var stringvalue : string   

//error: variable 'stringvalue' used before being initialized  

//let hashvalue = stringvalue.hashvalue  

//                            ^  

let hashvalue = stringvalue.hashvalue  

出錯的原因就是在使用stringvalue這個變數之前,沒有初始化這個變數,也就是這個變數根本就沒有得到記憶體,

這時就會出錯。

那麼我們可以使用optional型別,後面跟乙個?就是了。

[plain]view plain

copy

print

?// 這就是optional, strvalue自動得到預設值:nil   

// 這個nil跟objective-c中的nil不同,不是指標,而是表示值不存在。  

var strvalue: string?   

// 判斷optional是否有值  

if strvalue   

文件中有提到說,在使用optional值的時候需要在具體的操作,比如呼叫方法、屬性、下標索引等前面需要加上乙個

?,如果是nil值(不存在值),也就是

optional.none

,會跳過後面的操作不執行,如果有值,就是

optional.some

可能就會拆包(unwrap),然後對拆包後的值執行後面的操作,來保證執行這個操作的安全性,比如optional binding:

[plain]view plain

copy

print

?// optional binding  

// 如果strvalue == nil, 那麼結果就是nil,不會呼叫string的hasvalue  

// 如果strvalue != nil, 就返回strvalue對應的hashvalue值並賦值給常量hashvalue  

if let hashvalue = strvalue?.hashvalue   

在寫協議(protocol)時,對於可選**方法,也需要在呼叫時在函式名後跟著?,如:

[plain]view plain

copy

print

?// @objc 是用於處理swift與oc之間的轉換的,由於@optional是oc中的關鍵字,  

// 所以在protocol之前需要新增上@objc。  

當然我們也可以使用!來強制拆包,這是我們在保證有值的情況下才會這麼用:

[plain]view plain

copy

print

?var strvalue: string?  

strvalue = "1234"  

let integer = strvalue!.toint()  

// 更安全的寫法是  

if strvalue {  

let integer = strvalue!.toint()  

}  

隱式強拆包型別:

使用!來宣告變數,會成為隱式強拆包可選型別,這表示這個型別永遠不會出現nil的情況,但一旦出來,

在呼叫時就會崩潰。

[plain]view plain

copy

print

?// 使用這種方式宣告的話,在呼叫時不需要使用?或!來說明。  

var mylabel: uilabel!   

mylabel = uilabel(frame: cgrectmake(10, 100, 300, 10))  

mylabel.text = "label"  

總結:通常在什麼情況下才會使用optional型別呢?

(1)當我們需要宣告這樣乙個變數,變數在設計初始化函式中沒有進行初始化時,就需要宣告這個變數為optional型別。因為變數在使用前必須先

宣告,並且在設計初始化函式中進行初始化。比如我們在viewdidload函式中才進行初始化的控制項(類成員),就需要宣告為optional且必須是var宣告,

因為let宣告的常量只能是在初始化函式中進行初始化。

(2)當我們不知道是否會有值的時候,這個變數可以宣告為optional,比如**,我們並沒有要求必須傳**過來,那麼就需要宣告為optional。

(3)作為函式引數時,如果這個引數可以沒有值,那麼就使用optional型別,比如傳**的時候,通常就是可選的,可以設定為nil

......暫時只想到這些,任何人都可以繼續往下補充!

//**

Swift 二十一 協議 1

1 swift入門學習筆記 第一版 對swift的基礎知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文件為準 2 在學習完基本的知識點以後會結合官方文件及相關資料,在此版本的基礎上進行新增更改。類 結構體或列舉型別可遵循協議,並提供具體實現完成協議定義的方法和功能。除了遵循協議,我們也...

Swift學習筆記 二十一 下標

下標可以定義在類 結構體和列舉中,是訪問集合 表或序 中元素的快捷方式。可以使用下標的索引,設定和獲取值,而 需要再呼叫對應的訪問方法。舉例來說,下標訪問乙個 array 實 中的元素可以寫作 somearray index 訪問 dictionary 實 中的元素可以寫作 somedictiona...

MYSQL入門學習之二十一 MYSQL使用者管理

一 新增使用者 1 直接新增 mysql insert into mysql.user host,user,password values testuser password testuser 2 新增使用者並賦權 mysql grant select on test.to testuser1 lo...