轉(zhuǎn)載自http://wanwu.tech/2017/03/05/types/
我們已經(jīng)學(xué)習(xí)了基本的數(shù)據(jù)類型及其使用方法,也知道了我們有什么運(yùn)算符可用搀暑。如同上一章的問題,我們知道了怎么表達(dá)有兩個(gè)蘋果跨琳,但是怎么表達(dá)我的名字叫小明呢自点?
這個(gè)時(shí)候,我們就涉及到了新的數(shù)據(jù)類型:字符串脉让。這一章桂敛,我們首先會(huì)介紹什么是數(shù)據(jù)類型,然后介紹更多數(shù)字相關(guān)知識(shí)和字符串溅潜。
數(shù)據(jù)類型
數(shù)據(jù)類型是一種屬性术唬,用于指定數(shù)據(jù)的種類,比如我們上一章介紹的整數(shù)滚澜、浮點(diǎn)數(shù)粗仓。一個(gè)數(shù)據(jù),有數(shù)據(jù)類型设捐,同時(shí)也有一個(gè)相應(yīng)的名稱和值(或者屬性)借浊。上一章中,下面的代碼創(chuàng)建了一個(gè)數(shù)據(jù)類型為Int挡育,名稱為numberApple巴碗,值為10的數(shù)據(jù)朴爬。
let numberApple: Int = 10
類似的即寒,下面的代碼創(chuàng)建了數(shù)據(jù)類型為Double,名稱為price召噩,值為5.2的數(shù)據(jù)母赵。
let price: Double = 5.2
類型推斷
現(xiàn)在,看一下我們的代碼
let numberApple: Int = 10
let price: Double = 5.2
如果我按下面這樣寫(不指明數(shù)據(jù)類型)具滴,你能猜出來兩個(gè)數(shù)據(jù)分別是什么數(shù)據(jù)類型嗎凹嘲?
let numberApple = 10
let price = 5.2
提示:根據(jù)等號(hào)右邊的數(shù)據(jù)有沒有小數(shù)點(diǎn)來判斷
相信大家都可以猜出來吧?Swift也能构韵!這個(gè)猜測(cè)的過程叫做類型推斷周蹭。
那么,我們?nèi)绻氪_定Swift的推斷是否符合我們的心意怎么辦呢疲恢?一個(gè)方法是點(diǎn)擊右上角面板控制器的
Option
鍵宛畦,鼠標(biāo)點(diǎn)擊瘸洛,也可看到彈出框顯示具體信息。
那么什么時(shí)候可以使用類型推斷什么時(shí)候不行呢次和?一般來說你能猜出來反肋,Swift就能猜出來。你猜不出來踏施,Swift也難猜出來囚玫。
數(shù)據(jù)類型轉(zhuǎn)換
接下來,我們?nèi)绻雽?duì)價(jià)格(price)取整呢读规?可以這樣嗎?
let price: Double = 12.5
var priceInteger: Int = 0
priceInteger = age
我們的Playground會(huì)報(bào)錯(cuò):
Cannot assign value of type 'Double' to type 'Int'抓督。
并且會(huì)有修改建議:
Fix-it Replace "price" with "(Int)price"。
雙擊接受這條建議束亏,我們發(fā)現(xiàn)铃在,代碼變?yōu)榱耍?/p>
priceInteger = Int(price) // => 12
以上發(fā)生了什么事情呢?開始的報(bào)錯(cuò)碍遍,因?yàn)镾wift不允許你將一個(gè)“Double”數(shù)據(jù)隱式(悄悄地定铜,不公開說明)地轉(zhuǎn)變?yōu)椤癐nt”。推薦的修改建議是說怕敬,你要顯式(公開)地說明揣炕,你想把“Double”轉(zhuǎn)變?yōu)椤癐nt”。
為什么呢东跪?我們的price
值為5.2畸陡,那么它轉(zhuǎn)為“Int”后,小數(shù)怎么處理呢虽填?如果采用顯式轉(zhuǎn)換Int(age)
丁恭,Swift如同得到了你的授權(quán),它將把小數(shù)直接忽略斋日。但是如果反過來牲览,“Int”轉(zhuǎn)為“Double”呢?
price = priceInteger
我們發(fā)現(xiàn)恶守,還是不行第献!,因?yàn)?strong>swift是一門強(qiáng)類型語言兔港,它不允許任何隱式的數(shù)據(jù)轉(zhuǎn)換庸毫。
所以上面代碼必須改為:
price = Double(priceInteger)
由以上兩個(gè)例子,我們可以總結(jié)出押框,如果進(jìn)行數(shù)據(jù)轉(zhuǎn)換的話岔绸,其形式應(yīng)該是:
目標(biāo)數(shù)據(jù)類型的數(shù)據(jù) = 目標(biāo)數(shù)據(jù)類型(待轉(zhuǎn)換數(shù)據(jù))
操作多種數(shù)據(jù)類型
我們已經(jīng)知道了蘋果的數(shù)量,如果我們?cè)僦捞O果的單價(jià),那么我們就可以計(jì)算出蘋果的總價(jià)了吧:
let numberApple: Int = 10
let price: Double = 5.2
let totalPrice: Double = numberApple * price
在Playground中嘗試盒揉,你應(yīng)該會(huì)發(fā)現(xiàn)報(bào)錯(cuò):
Binary operator '*' cannot be applied to operands of type 'Double' and 'Int'
這是為什么呢晋被?因?yàn)?code>numberApple是“Int”數(shù)據(jù),而price
是“Double"數(shù)據(jù)刚盈,不是一種類型羡洛。如果要計(jì)算,必須將他們轉(zhuǎn)變?yōu)橥环N數(shù)據(jù)類型藕漱。如果你想要結(jié)果為“Int”欲侮,那么就把price
轉(zhuǎn)變?yōu)椤癐nt”再做計(jì)算。這里肋联,我們的totalPrice
是“Double”威蕉,所以我們應(yīng)該將numberApple
轉(zhuǎn)為“Double”:
let numberApple: Int = 10
let price: Double = 5.2
let totalPrice: Double = Double(numberApple) * price
小練習(xí)
將上面計(jì)算總價(jià)的代碼片段使用類型推斷重寫,并使用介紹的兩種方法查看其推斷類型橄仍。
字符串
在本章開始韧涨,我們要解決怎么表達(dá)我的名字叫小明的問題。這個(gè)時(shí)候侮繁,就輪到字符串(String)數(shù)據(jù)類型出場(chǎng)了虑粥。
字符串定義
let name = "xiaoming"
let name2 = "小明"
上面的代碼定義了兩個(gè)名字,一個(gè)英文是“xiaoming”宪哩,另一個(gè)是中文的“小明”娩贷。等號(hào)左邊的部分叫做字符串字面值,使用雙引號(hào)括起來锁孟。
很明顯彬祖,上面的代碼我們靠類型推斷來判斷出以上兩個(gè)常量是字符串,那么如果我們想顯式聲明呢罗岖,我們可以這樣:
let name:String = "xiaoming"
let name2: String = "小明"
字符串操作
如果我們想要把名字分成“姓”和“名”分開存儲(chǔ)涧至,但是一起顯示,可以怎么做呢桑包,我們可以嘗試下面方法把兩個(gè)字符串用加號(hào)”+“加起來:
let firstName = "Meimei"
let lastName = "Han"
let fullName = firstName + lastName
print(fullName)
我們注意到這個(gè)方法是可行的,但是有一個(gè)人問題纺非,英文的“姓”和“名”需要中間有空格哑了,怎么辦呢?我們中間加一個(gè)空格試試:
let fullName = firstName + " " + lastName
現(xiàn)在我們通過print(fullName)
方法來打印全名烧颖,但是如果我想表達(dá)更完整信息呢弱左,比如“我的名字叫某某,身高XXX”怎么辦炕淮?
let firstName = "Meimei"
let lastName = "Han"
let height: Double = 1.72
let fullName = firstName + " " + lastName
print("My name is " + firstName + " and my height is " + String(height))
上面代碼我們除了使用字符串相加拆火,還使用了類型轉(zhuǎn)換,將一個(gè)“Double”型常量轉(zhuǎn)為了“String”。
但是有一個(gè)問題们镜,你看雙引號(hào)看暈了嗎币叹?說實(shí)話,寫多了我已經(jīng)有點(diǎn)暈了模狭。那怎么辦呢颈抚?試試下面方法:
print("My name is \(firstName) and my height is \(height)")
這里,我們使用了字符串插值的方法嚼鹉,大大簡(jiǎn)化了代碼的書寫贩汉,提高了可讀性。值得注意的是锚赤,這里我們?cè)谧霾逯档臅r(shí)候匹舞,數(shù)字直接轉(zhuǎn)為了字符串。
總結(jié)
- 更過數(shù)字類型的操作
- 類型轉(zhuǎn)換
- 字符串基本操作
下一步
韓梅梅已經(jīng)是一個(gè)大美女了线脚,那么如果李雷還和她在一起策菜,他們應(yīng)該結(jié)婚了吧?(90酒贬,00后有興趣可以百度韓梅梅和李雷的故事又憨,我也想寫你們的故事,但是我不知道啊锭吨。蠢莺。。)