最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Swift中的變量與常量

 更新時間:2017年01月12日 14:22:11   作者:CoderYQ  
本文主要是介紹Swift中最常用的常量和變量,將從“變量常量的定義”、"如何聲明變量常量"、“變量和常量的命名”,"變量常量的本質(zhì)區(qū)別"四個方面入手,重點介紹變量和常量的使用以及區(qū)別,希望大家在閱讀完本文后都可以熟練使用它們。有需要的朋友們下面來一起學(xué)習(xí)吧。

前言

最近在學(xué)習(xí)Swift這門新語言,對于熟練掌握OC編程的iOS開發(fā)者來說其實很容易上手,但Swift的確在語法和編程習(xí)慣上改變了很多,對于從未了解OC語言而從Swift開始學(xué)習(xí)iOS開發(fā)的新手來說可能上手有一定難度,下面我將這段時間的學(xué)習(xí)成果結(jié)合在網(wǎng)上搜索的知識做一個簡單的匯總,希望可以幫助到正在學(xué)習(xí)Swift的小伙伴們。

變量和常量的定義

Swift開發(fā)文檔中是這樣定義變量和常量的:常量和變量把名字和一個特定類型的值關(guān)聯(lián)起來。常量的值一旦設(shè)置好便不能再被更改,然而變量可以在將來被設(shè)置為不同的值(見名知意,很簡單了啦)

如何聲明變量常量

常量和變量必須在使用前被聲明,使用關(guān)鍵字 let 來聲明常量,使用關(guān)鍵字 var 來聲明變量。舉個簡單的例子:

class Person: NSObject {
 let life = 1
 var age = 0
}

這里我們有一個Person類繼承NSObject,顯然人的生命只有一條應(yīng)該設(shè)置為不可以改變的常量,但是人的年齡是隨著時間變化的應(yīng)該聲明為變量,同理,當(dāng)你在開發(fā)過程中有類似需求時應(yīng)該這樣來選擇何時使用變量、何時使用常量。
當(dāng)然我們可以選擇一行代碼以逗號分隔的形式申明多個簡單的變量或常量如下所示:

 var a = 0, b = 1.0, c = "CoderYQ"

這里需要講解一下關(guān)于Swift中的類型安全和類型推斷。Swift 是一門類型安全的語言,即你必須時刻清楚此時代碼需要處理的值的類型,編譯器會進行類型檢查,任何不匹配的類型都會被標(biāo)記為錯誤當(dāng)然更不能參與運算。當(dāng)你操作不同類型的值時,類型檢查能幫助你避免錯誤。當(dāng)然并不是所有的變量和常量都需要明確指出一個確定的類型,如果你沒有為申明的變量或常量指定類型,Swift 會使用類型推斷的功能推斷出合適的類型,通過檢查你給變量賦的值,類型推斷能夠在編譯階段自動的推斷出值的類型,這就是Swift中類型推斷。就像上面的連續(xù)申明變量a、b、c的代碼中我們并沒有明確指出a、b、c的類型,編譯器則是通過你給a、b、c賦的值來推斷a、b、c的類型分別為:Int類型、Double類型、String類型。

但是在某些必要時刻我們是需要給申明的變量或常量提供類型標(biāo)注的,以此來明確他們能夠存儲的值。添加類型標(biāo)注的方法是在變量或常量的名字后邊加一個冒號,再跟一個空格,最后加上要使用的類型名稱(這里和OC中不太一樣,需要大家適應(yīng)一下),如下所示的代碼效果其實和上面的是一樣的:

var a: Int = 0
var b: Double = 1.0
var c: String = "CoderYQ"

如果變量的類型都一樣,我們還可以這樣申明:

var a, b, c : Double

變量和常量的命名

常量和變量的名字幾乎可以使用任何字符,甚至包括 Unicode 字符:

let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dog cow"

但是要注意一點:常量和變量的名字不能包含空白字符、數(shù)學(xué)符號箭頭、保留的(或者無效的)Unicode 碼位、連線制表符。也不能以數(shù)字開頭,盡管數(shù)字幾乎可以使用在名字其他的任何地方。一旦你聲明了一個確定類型的常量或者變量,就不能使用相同的名字再次進行聲明,也不能讓它改存其他類型的值。常量和變量之間也不能互換,如果你需要使用 Swift 保留的關(guān)鍵字來給常量或變量命名,可以使用反引號( ` )包圍它來作為名稱??傊?,除非別無選擇,避免使用關(guān)鍵字作為名字除非你確實別無選擇(引自文檔翻譯,沒什么好說的...)。

總結(jié)一句:Swift中變量和常量的命名相較于OC中更加靈活多變,但是仍然有上面的規(guī)定需要注意,而且他們的命名盡量做到見名知意,以便于開發(fā)人員之間的協(xié)同合作。這里我給大家列出了Swift中主要的關(guān)鍵字,希望大家在命名的時候盡量規(guī)避他們。
用作聲明的關(guān)鍵字:

class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias、var

用作語句的關(guān)鍵字:

break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where、while

用作表達和類型的關(guān)鍵字:

as、dynamicType、is、new、super、self、Self、Type、__COLUMN__、__FILE__、__FUNCTION__、__LINE__

特定上下文中被保留的關(guān)鍵字:

associativity、didSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、right、set、unowned、unowned(safe)、unowned(unsafe)、weak、willSet

變量常量的本質(zhì)區(qū)別

經(jīng)過上面的學(xué)習(xí)我們已經(jīng)能夠熟練使用常量和變量了,那么常量和變量的本質(zhì)區(qū)別到底是什么呢?這里通過例子說明一下:

//通過 UIView() 方法創(chuàng)建一個 UIView 的對象(假設(shè)系統(tǒng)分配的內(nèi)存地址為:0x7faa31616bb0)并賦值給申明為 UIView類型 的常量:view0
let view0 : UIView = UIView()

//通過 UIView() 方法創(chuàng)建另外一個 UIView 的對象(假設(shè)系統(tǒng)分配的內(nèi)存地址為:0x7f9890c062b0) 并賦值給申明為 UIView類型 的變量:view1
var view1 : UIView = UIView()

第一行代碼的意思:首先在內(nèi)存中的堆區(qū)創(chuàng)建一個內(nèi)存地址為0x7faa31616bb0 的UIView類型的對象,然后在內(nèi)存中的棧區(qū)申明一個名為view0的常量指向該對象,即view0中保存的是0x7faa31616bb0這個地址,而且該常量的值是不可變的(這不廢話嗎),即view0中保存的內(nèi)存地址不能變了。

第二行代碼的意思: 在堆區(qū)又創(chuàng)建一個新的內(nèi)存地址為0x7f9890c062b0的UIView類型的對象,然后在棧區(qū)又申明一個名為view1的變量指向該對象,即view0中保存的是0x7faa31616bb0這個地址,注意此時view1的值是可以改變的,即view1中保存的內(nèi)存地址是可以變化的。

如果此時執(zhí)行下面的操作:

//重新創(chuàng)建一個新的 UIView 的對象(假設(shè)系統(tǒng)分配的內(nèi)存地址為:0x7f9890c042b0)并賦值給上面的常量 view0
view0 = UIView()

編譯器會報這樣的錯誤:

 error: cannot assign to value: 'view0' is a 'let' constant,change 'let' to 'var' to make it mutable

主要是因為創(chuàng)建的新的對象有一個新的內(nèi)存地址,你把新的對象重新賦值給view0,即view0現(xiàn)在指向另一個對象了,相當(dāng)于將view0中的原來存儲的0x7faa31616bb0內(nèi)存地址修改成了0x7f9890c042b0,但是view0中存儲的內(nèi)存地址一旦賦值了是不能修改的,所以編譯器這里就報錯了,他建議你將 let 變成 var 來申明 view0

//重新創(chuàng)建一個新的 UIView 的對象(假設(shè)系統(tǒng)分配的內(nèi)存地址為:0x7f9890c042b0)并賦值給上面的變量 view1
view1 = UIView()

這里是不會報錯的,因為view1中保存的內(nèi)存地址是可以修改的。

但是如果我接著執(zhí)行下面的代碼,編譯器會不會報錯呢?

view0.backgroundColor = UIColor.white
view0.backgroundColor = UIColor.black

兩段代碼的意思:先將 view0 的背景色設(shè)置為白色,然后將view0的背景色修改為黑色(Swift2.0和Swift3.0的修改背景色的方法有所不同,這里使用的是Swift3.0,只是精簡了代碼,并無本質(zhì)區(qū)別)

答案是不會的,因為在上面的操作中我并沒有修改view0中保存的內(nèi)存地址,只是通過view0中保存的內(nèi)存地址拿到view0指向的對象,然后修改對象內(nèi)部的屬性(這里是backgroundColor,還可以是frame等等),和 view0 是常量還是變量并沒有關(guān)系。

總結(jié)

常量的值不可修改的的本質(zhì)是其保存的內(nèi)存地址不可修改,但是可以通過該地址拿到地址指向的對象并修改對象的屬性。

變量的值可以修改的本質(zhì)是其保存的內(nèi)存地址可以修改。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • Swift之for循環(huán)的基礎(chǔ)使用學(xué)習(xí)

    Swift之for循環(huán)的基礎(chǔ)使用學(xué)習(xí)

    這篇文章主要為大家介紹了Swift之for循環(huán)的基礎(chǔ)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • openstack重啟swift服務(wù)后報錯問題解決方案

    openstack重啟swift服務(wù)后報錯問題解決方案

    這篇文章主要介紹了解決openstack重啟swift服務(wù)后報錯,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Swift編程中的一些類型轉(zhuǎn)換方法詳解

    Swift編程中的一些類型轉(zhuǎn)換方法詳解

    這篇文章主要介紹了Swift編程中的一些類型轉(zhuǎn)換方法詳解,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Swift 3.0 enum 的靈活使用介紹

    Swift 3.0 enum 的靈活使用介紹

    這篇文章主要介紹了Swift 3.0 enum 的靈活使用介紹,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • Swift hello world!Swift快速入門教程

    Swift hello world!Swift快速入門教程

    這篇文章主要介紹了Swift hello world!Swift快速入門教程,本文在快速了解Swift編程語言,需要的朋友可以參考下
    2014-07-07
  • swift實現(xiàn)簡易計算器項目

    swift實現(xiàn)簡易計算器項目

    這篇文章主要為大家詳細介紹了swift實現(xiàn)簡易計算器項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細的示例代碼,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Swift中優(yōu)雅處理閉包導(dǎo)致的循環(huán)引用詳解

    Swift中優(yōu)雅處理閉包導(dǎo)致的循環(huán)引用詳解

    這篇文章主要給大家介紹了關(guān)于Swift中優(yōu)雅的處理閉包導(dǎo)致的循環(huán)引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Swift具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • iOS UITableView展開縮放動畫實例代碼

    iOS UITableView展開縮放動畫實例代碼

    這篇文章主要介紹了Swift UITableView展開縮放動畫實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring中BeanFactory與FactoryBean的區(qū)別解讀

    Spring中BeanFactory與FactoryBean的區(qū)別解讀

    這篇文章主要介紹了Spring中BeanFactory與FactoryBean的區(qū)別解讀,Java的BeanFactory是Spring框架中的一個接口,它是用來管理和創(chuàng)建對象的工廠接口,在Spring中,我們可以定義多個BeanFactory來管理不同的組件,需要的朋友可以參考下
    2023-12-12

最新評論

沂源县| 秭归县| 绥滨县| 措美县| 陈巴尔虎旗| 永靖县| 松原市| 航空| 拜城县| 盱眙县| 伊川县| 凤凰县| 乐昌市| 阿拉善左旗| 南靖县| 土默特左旗| 银川市| 甘洛县| 双鸭山市| 石棉县| 玛曲县| 郓城县| 左云县| 岑巩县| 额济纳旗| 襄樊市| 西昌市| 山西省| 大荔县| 瑞昌市| 武强县| 九台市| 壤塘县| 南开区| 泰和县| 璧山县| 汽车| 南陵县| 南宁市| 西城区| 江源县|