深化了解Swift中的變量與常量。本站提示廣大學習愛好者:(深化了解Swift中的變量與常量)文章只能為提供參考,不一定能成為您想要的結果。以下是深化了解Swift中的變量與常量正文
前言
最近在學習Swift這門新言語,關於純熟掌握OC編程的iOS開發者來說其實很容易上手,但Swift確實在語法和編程習氣上改動了很多,關於從未理解OC言語而從Swift開端學習iOS開發的老手來說能夠上手有一定難度,上面我將這段時間的學習效果結合在網上搜索的知識做一個復雜的匯總,希望可以協助到正在學習Swift的小同伴們。
變量和常量的定義
Swift開發文檔中是這樣定義變量和常量的:常量和變量把名字和一個特定類型的值關聯起來。常量的值一旦設置好便不能再被更改,但是變量可以在未來被設置為不同的值(見名知意,很復雜了啦)
如何聲明變量常量
常量和變量必需在運用前被聲明,運用關鍵字 let 來聲明常量,運用關鍵字 var 來聲明變量。舉個復雜的例子:
class Person: NSObject { let life = 1 var age = 0 }
這裡我們有一個Person類承繼NSObject,顯然人的生命只要一條應該設置為不可以改動的常量,但是人的年齡是隨著時間變化的應該聲明為變量,同理,當你在開發進程中有相似需求時應該這樣來選擇何時運用變量、何時運用常量。
當然我們可以選擇一行代碼以逗號分隔的方式聲明多個復雜的變量或常量如下所示:
var a = 0, b = 1.0, c = "CoderYQ"
這裡需求解說一下關於Swift中的類型平安和類型推斷。Swift 是一門類型平安的言語,即你必需時辰清楚此時代碼需求處置的值的類型,編譯器會停止類型反省,任何不婚配的類型都會被標志為錯誤當然更不能參與運算。當你操作不同類型的值時,類型反省能協助你防止錯誤。當然並不是一切的變量和常量都需求明白指出一個確定的類型,假如你沒無為聲明的變量或常量指定類型,Swift 會運用類型推斷的功用推斷出適宜的類型,經過反省你給變量賦的值,類型推斷可以在編譯階段自動的推斷出值的類型,這就是Swift中類型推斷。好像下面的延續聲明變量a、b、c的代碼中我們並沒有明白指出a、b、c的類型,編譯器則是經過你給a、b、c賦的值來推斷a、b、c的類型辨別為:Int類型、Double類型、String類型。
但是在某些必要時辰我們是需求給聲明的變量或常量提供類型標注的,以此來明白他們可以存儲的值。添加類型標注的辦法是在變量或常量的名字後邊加一個冒號,再跟一個空格,最後加上要運用的類型稱號(這裡和OC中不太一樣,需求大家順應一下),如下所示的代碼效果其實和下面的是一樣的:
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"
但是要留意一點:常量和變量的名字不能包括空白字符、數學符號、箭頭、保存的(或許有效的)Unicode 碼位、連線和制表符。也不能以數字掃尾,雖然數字簡直可以運用在名字其他的任何中央。一旦你聲明了一個確定類型的常量或許變量,就不能運用相反的名字再次停止聲明,也不能讓它改存其他類型的值。常量和變量之間也不能互換,假如你需求運用 Swift 保存的關鍵字來給常量或變量命名,可以運用反引號( ` )包圍它來作為稱號。總之,除非別無選擇,防止運用關鍵字作為名字除非你的確別無選擇(引自文檔翻譯,沒什麼好說的...)。
總結一句:Swift中變量和常量的命名相較於OC中愈加靈敏多變,但是依然有下面的規則需求留意,而且他們的命名盡量做到見名知意,以便於開發人員之間的協同協作。這裡我給大家列出了Swift中次要的關鍵字,希望大家在命名的時分盡量躲避他們。
用作聲明的關鍵字:
class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias、var
用作語句的關鍵字:
break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where、while
用作表達和類型的關鍵字:
as、dynamicType、is、new、super、self、Self、Type、__COLUMN__、__FILE__、__FUNCTION__、__LINE__
特定上下文中被保存的關鍵字:
associativity、didSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、right、set、unowned、unowned(safe)、unowned(unsafe)、weak、willSet
變量常量的實質區別
經過下面的學習我們曾經可以純熟運用常量和變量了,那麼常量和變量的實質區別究竟是什麼呢?這裡經過例子闡明一下:
//經過 UIView() 辦法創立一個 UIView 的對象(假定零碎分配的內存地址為:0x7faa31616bb0)並賦值給聲明為 UIView類型 的常量:view0 let view0 : UIView = UIView() //經過 UIView() 辦法創立另外一個 UIView 的對象(假定零碎分配的內存地址為:0x7f9890c062b0) 並賦值給聲明為 UIView類型 的變量:view1 var view1 : UIView = UIView()
第一行代碼的意思:首先在內存中的堆區創立一個內存地址為0x7faa31616bb0 的UIView類型的對象,然後在內存中的棧區聲明一個名為view0的常量指向該對象,即view0中保管的是0x7faa31616bb0這個地址,而且該常量的值是不可變的(這不廢話嗎),即view0中保管的內存地址不能變了。
第二行代碼的意思: 在堆區又創立一個新的內存地址為0x7f9890c062b0的UIView類型的對象,然後在棧區又聲明一個名為view1的變量指向該對象,即view0中保管的是0x7faa31616bb0這個地址,留意此時view1的值是可以改動的,即view1中保管的內存地址是可以變化的。
假如此時執行上面的操作:
//重新創立一個新的 UIView 的對象(假定零碎分配的內存地址為:0x7f9890c042b0)並賦值給下面的常量 view0 view0 = UIView()
編譯器會報這樣的錯誤:
error: cannot assign to value: 'view0' is a 'let' constant,change 'let' to 'var' to make it mutable
次要是由於創立的新的對象有一個新的內存地址,你把新的對象重新賦值給view0,即view0如今指向另一個對象了,相當於將view0中的原來存儲的0x7faa31616bb0內存地址修正成了0x7f9890c042b0,但是view0中存儲的內存地址一旦賦值了是不能修正的,所以編譯器這裡就報錯了,他建議你將 let 變成 var 來聲明 view0
//重新創立一個新的 UIView 的對象(假定零碎分配的內存地址為:0x7f9890c042b0)並賦值給下面的變量 view1 view1 = UIView()
這裡是不會報錯的,由於view1中保管的內存地址是可以修正的。
但是假如我接著執行上面的代碼,編譯器會不會報錯呢?
view0.backgroundColor = UIColor.white view0.backgroundColor = UIColor.black
兩段代碼的意思:先將 view0 的背風光設置為白色,然後將view0的背風光修正為黑色(Swift2.0和Swift3.0的修正背風光的辦法有所不同,這裡運用的是Swift3.0,只是精簡了代碼,並無實質區別)
答案是不會的,由於在下面的操作中我並沒有修正view0中保管的內存地址,只是經過view0中保管的內存地址拿到view0指向的對象,然後修正對象外部的屬性(這裡是backgroundColor,還可以是frame等等),和 view0 是常量還是變量並沒有關系。
總結
常量的值不可修正的的實質是其保管的內存地址不可修正,但是可以經過該地址拿到地址指向的對象並修正對象的屬性。
變量的值可以修正的實質是其保管的內存地址可以修正。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或許任務能帶來一定的協助,假如有疑問大家可以留言交流。