標籤:swift 變數聲明 var let ios
變數聲明1、普通變數swift 像javascript一樣是可以智能推斷類型的,他會根據我們變數的值來推斷變數的類型
var age = 10 // Int
var name ="lily" //編譯器會自動推斷出String
static let name = "MyClass" //靜態常量 通過類名直接存取 eg: ClassName.name
2、儲存型變數或者儲存型屬性
文法:var variable name: type = expression
例子:
var str:String = "hellp world" //指定str是String類型 var age:Int = 10 //指定為int類型
你可以在全域,函數內,或者在類和結構體的聲明(context)中使用這種形式來聲明一個變數。當變數以這種形式 在全域或者一個函數內被聲明時,它代表一個儲存型變數。當它在類或者結構體中被聲明時,它代表一個儲存型變數屬性。
3、計算型變數和計算型屬性
文法:
var variable name: type { get { statements } set(setter name) { statements }}
例子:
private var _aa :String = ""var aa:String { get{ return self._aa; } set{ self._aa=newValue; }}
然後在調用的時候很簡單的ClassName.aa="xxx" 這個相當於調用了set ,print(ClassName.aa) 這個相當於調用了get。 當然這邊set是可以接收一個參數的 ,可以不謝預設是 newValue , 也可以自己定義 ,如 set(myValue) { self._aa = myValue; } 當然我這裡只是一個很簡單的例子,在真實的項目中可能在get或者set值得時候需要對值進行判斷或者一系列的計算後返回。根據實際項目而定。
4、儲存型變數監視器和屬性監視器
文法:
var variable name: type = expression { willSet(setter name) { statements } didSet(setter name) { statements }}
例子:
<swift>var age:Int = 0 { willSet { print("willset an new Value \(newValue)") //willset監視器只有在變數或屬性值被改變之前運行newvalue } didSet { print("didset an old value \(oldValue) will change to age \(age)") //didset監視器在變數或屬性值被改變後立即運行oldvalue }}</swift>
這裡willset監視器只有在變數或屬性值被改變之前運行。新的值作為一個常量經過過willset監視器,因此不可以在 willset語句中改變它。didset監視器在變數或屬性值被改變後立即運行。和willset監視器相反,為了以防止你仍然 需要獲得舊的資料,舊變數值或者屬性會經過didset監視器。這意味著,如果你在變數或屬性自身的didiset監視器語句 中設定了一個值,你設定的新值會取代剛剛在willset監視器中經過的那個值。
我這裡這個代碼塊在 Demo1 類中寫的 ,調用的時候如下:
let dm = Demo1() dm.age=20 dm.age=38
控制台列印的結果:
willset an new Value 20
didset an old value 0 will change to age 20
willset an new Value 38
didset an old value 20 will change to age 38
5、變數中的 ! 和 ?
Swift裡不會自動給變數賦初始值 也就是說變數不會有預設值,所以要求使用變數之前必須要對其初始化,如果沒有初始化就會報錯
var str : String > error: variable ‘str‘ used before being initialized
出錯的原因就是在使用str這個變數之前,沒有初始化這個變數,也就是這個變數根本就沒有得到記憶體
這時候 我們可以使用optional類型,也就是後面跟一個?
var str1:String?//如果str1 == nil 就不會調用hashValue方法 也就不會執行if語句塊//如果str1 != nil 執行其hashValue方法 賦值給valif let val = str1?.hashValue{ print("has value")}else{ print("no value")}>>> 這時候 輸出的是 no v alue
?是嘗試拆包 !是強制拆包
var str2:String?str2="1"//! 表示 確定str2一定有值 如果沒有值 就會報錯 一般在保證有值得情況下才會這麼做print(str2!.hashValue) //"4799450059485597623\n"
//使用這種方式聲明 在調用的時候不用加? or ! ,表示 調用的時候 肯定是有值的 如果沒有值 就會報錯var str3: String!str3 = "111"print(str3.hashValue)
當然還有很多使用! 和 ? 的地方 如委託之類的,在這裡就補贅述了,關於變數這裡先總結這麼多以後有更多相關會繼續補充。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Swift 詳解之一 -------- 變數聲明