swift對數(shù)據(jù)進(jìn)行了分類,分類是人類認(rèn)識(shí)這個(gè)世界的重要方法,我們在學(xué)習(xí)的過程中常常會(huì)用到這種方法仅颇,比方我們把世界分類為動(dòng)物,植物抛猖,有機(jī)物無機(jī)物等等,這里有一個(gè)有趣的矛盾路克,我們一邊對世界做分類樟结,一邊還要探索世界的本源,人類越是認(rèn)識(shí)這個(gè)到這個(gè)世界的五彩繽紛精算,人類就也迫切希望能夠知道這個(gè)世界的本源是什么瓢宦。
這個(gè)矛盾也同時(shí)存在于swift語言當(dāng)中。swift一面對數(shù)據(jù)做分類灰羽,一面通過對類型抽象來實(shí)現(xiàn)一致性的表達(dá)驮履。我們先描述一下swift的分類,后面會(huì)詳細(xì)整理類型的抽象廉嚼。
1玫镐、基本類型
- Int:表示整數(shù),包括正數(shù)怠噪、零恐似、負(fù)數(shù),例如 1傍念、0矫夷、-1
整型包括符號(hào)整型(Int)葛闷、無符號(hào)整型(UInt),每種類型又包括8双藕、16淑趾、32、64位的表達(dá)形式忧陪,對于一個(gè)初學(xué)者來說扣泊,你完全可以暫時(shí)忽略這些內(nèi)容,只簡單使用 Int嘶摊。
- String: 表示文本延蟹,例如我們已經(jīng)使用過的 "Hello,swift",在swift中,用""括起來的內(nèi)容基本就是文本類型更卒。
注意
我們經(jīng)常需要對String進(jìn)行拼接等孵、遍歷、替換字符等操作蹂空,因?yàn)镾tring是值類型,其內(nèi)容又是characters集合類型果录,所以其可變性暫時(shí)超過了我們今天需要總結(jié)的內(nèi)容上枕,我后面會(huì)增補(bǔ)一個(gè)鏈接來補(bǔ)充總結(jié)。
- 浮點(diǎn)數(shù)(Double弱恒、Float): 浮點(diǎn)數(shù)用來表示帶有小數(shù)部分的數(shù)字辨萍,例如 3.1415926
浮點(diǎn)數(shù)分為兩種類型,Double和Float返弹,他們都可以表示浮點(diǎn)數(shù)锈玉,區(qū)別在于Double類型的精度更高,代價(jià)呢也就是占用的內(nèi)存更多义起,精度有多高拉背?留到我們整整需要了解的時(shí)候再研究吧,我們需要了解的是:swift默認(rèn)會(huì)為你選擇Double類型默终。
- Bool: 布爾類型椅棺,用來表示 “真” 或者 “假”
Bool類型只有兩個(gè)值,true和fase齐蔽。Bool類型的值可以幫助我們來控制流程分支两疚,否則恐怕我們只能寫出線性執(zhí)行的程序了。
有了這些基本類型我們就可以方便的為現(xiàn)實(shí)世界中的事物進(jìn)行建模了含滴,比方說我們來描繪一下一位同學(xué)的信息狀況诱渤。
var name = "小明" // 姓名 為 ”小明“,使用了String
var age = 21 // 年紀(jì) = 21 谈况,使用了 Int
var height = 175.5 // 身高 = 175.5勺美,使用了 浮點(diǎn)數(shù)(Double)
var married = false // 婚姻狀態(tài) = false 递胧,使用了 Bool 類型
2、類型安全
swift語言對類型的態(tài)度是非忱常“較真”的谓着,有些語言確持有相反的態(tài)度,我們先看一下ruby語言對這個(gè)問題的處理方式
x = 10 // 先將變量x賦值一個(gè)整數(shù)
x = "Hello,World" // 現(xiàn)在將x重新賦值一個(gè)字符串坛掠,我們可以看到赊锚,賦值成功了
在面對用新的類型對x進(jìn)行重新復(fù)制的時(shí)候,ruby表現(xiàn)出了”您隨意“的寬容態(tài)度屉栓。我們繼續(xù)看舷蒲,我們對x進(jìn)行一次數(shù)學(xué)運(yùn)算操作會(huì)怎樣。
x = 10
x = "Hello,World"
x = x - 1 // error !!!!!!
這時(shí)候ruby會(huì)毫不遲疑的拋出錯(cuò)誤友多,態(tài)度是這樣的:“這個(gè)錯(cuò)誤和我可是沒有關(guān)系的牲平,完全是程序員自己賦值是類型弄錯(cuò)了”。這是寬容背后的殘忍嗎域滥?
現(xiàn)在我們再看一下swift對同一個(gè)問題的態(tài)度纵柿,我們嘗試將小明的年紀(jì)修改為一個(gè)字符串。
var age = 21
age = "Hello,World" // error !!!!!!
如果我們進(jìn)嘗試行這樣的修改启绰,那么我們會(huì)立刻得到swift編譯器給我們的錯(cuò)誤提示:“抱怨我們將一個(gè)String類型的值賦給一個(gè)Int類型的變量”昂儒。在ruby中可能會(huì)發(fā)生的錯(cuò)誤,在swift中委可,絕對不允許渊跋,不允許。這就是swift對類型的態(tài)度着倾。swift編譯器會(huì)對類型進(jìn)行嚴(yán)格的檢查拾酝,明確每一個(gè)值所屬的類型,禁止類型“錯(cuò)位”卡者,把運(yùn)行時(shí)錯(cuò)誤降到最低蒿囤。
3、類型推斷
那么問題來了虎眨,swift是如何知道age是一個(gè)Int類型蟋软,而不是一個(gè)String類型的呢?這里swift使用了類型推斷機(jī)制嗽桩。當(dāng)我們給age進(jìn)行賦值21的時(shí)候岳守,編譯器會(huì)根據(jù)21的類型(Int),來推斷出age的類型一定為Int類型碌冶。通常靜態(tài)類型的語言會(huì)要求我們聲明變量的時(shí)候湿痢,同時(shí)指明變量的類型,類型推斷則是一種延時(shí)方式,允許我們將類型的確定延時(shí)到第一次賦值的時(shí)候譬重。
4拒逮、顯示聲明
那我們是不是只有在變量賦值的時(shí)候才能確定一個(gè)變量的類型呢?當(dāng)然不是了臀规,swift同樣為我們提供了顯示聲明的方式滩援,允許我們在聲明一個(gè)變量的時(shí)候就指定變量的類型。我們用顯示聲明的方式塔嬉,從新描述一下小明的信息玩徊。
var name: String = "小明"
var age: Int = 21
var height: Double = 175.5
var married: Bool = false
顯示聲明時(shí)指定變量的類型的工作通常是重復(fù)又缺少意義的,swift為我們提供了類型推斷機(jī)制谨究,減輕我們編程的工作量恩袱,編譯器越是聰明,我們的工作就會(huì)越輕松愉快胶哲。