變量聲明
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書籍