Swift 詳解之一 -------- 變數聲明

來源:互聯網
上載者:User

標籤: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 詳解之一 -------- 變數聲明

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.