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

變量聲明

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方法 賦值給val
if  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)

6、別名

swift支持別名使用關鍵字typealias

例子 :

typealias myInt = Int  //myInt 聲明爲Int的別名
var age : myInt = 10    

當然還有很多使用! 和 ? 的地方 如委託之類的,在這裏就補贅述了,關於變量這裏先總結這麼多以後有更多相關會繼續補充。

學習iOS,有他就夠了,小碼哥視頻,傳智、黑馬、各種swift書籍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章