版本記錄
| 版本號(hào) | 時(shí)間 |
|---|---|
| V1.0 | 2017.07.22 |
前言
我是swift2.0的時(shí)候開(kāi)始接觸的,記得那時(shí)候還不是很穩(wěn)定,公司的項(xiàng)目也都是用oc做的,并不對(duì)swift很重視,我自己學(xué)了一段時(shí)間,到現(xiàn)在swift3.0+已經(jīng)出來(lái)了,自己平時(shí)也不寫,忘記的也差不多了,正好項(xiàng)目這段時(shí)間已經(jīng)上線了,不是很忙,我就可以每天總結(jié)一點(diǎn)了,希望對(duì)自己對(duì)大家有所幫助。在總結(jié)的時(shí)候我會(huì)對(duì)比oc進(jìn)行說(shuō)明,有代碼的我會(huì)給出相關(guān)比對(duì)代碼。
1. swift簡(jiǎn)單總結(jié)(一)—— 數(shù)據(jù)簡(jiǎn)單值和類型轉(zhuǎn)換
2. swift簡(jiǎn)單總結(jié)(二)—— 簡(jiǎn)單值和控制流
3. swift簡(jiǎn)單總結(jié)(三)—— 循環(huán)控制和函數(shù)
4. swift簡(jiǎn)單總結(jié)(四)—— 函數(shù)和類
5. swift簡(jiǎn)單總結(jié)(五)—— 枚舉和結(jié)構(gòu)體
6. swift簡(jiǎn)單總結(jié)(六)—— 協(xié)議擴(kuò)展與泛型
Swift數(shù)據(jù)優(yōu)勢(shì)
??不知道大家還能否回憶起與oc相比,在數(shù)據(jù)類型方面swift有哪些不同了。
-
swift中增加了元組(tuple)的概念,元組可以讓你創(chuàng)建或者傳遞一組數(shù)據(jù),比如作為函數(shù)的返回值時(shí),你可以使用一個(gè)元組可以返回多個(gè)值。 -
swift還增加了Optional類型,用于處理值缺失的情況,表示的是那兒有一個(gè)值,并且它等于x或者那兒沒(méi)有值??蛇x有點(diǎn)像oc中的nil。但是它尅用在任何類型上,不僅僅是類,可選類型比oc中的nil指針更加安全也更具表現(xiàn)力,它是swift強(qiáng)大功能的重要組成部分。
常量和變量的命名
??與oc一樣,swift中常量和變量也有一定的命名規(guī)則的,下面我們就看一下。
可以使用任何喜歡的字符作為常量或者變量名,包括unicode字符,如下所示:
let π = 3.14159
let 你好 = "你好world"
??常量與變量名不能包含數(shù)字符號(hào),箭頭,保留的(或者非法的)Unicode碼位,連線與制表符,也不能以數(shù)字開(kāi)頭,但是可以在常量與變量名的其他地方包含數(shù)字。
注意:你也可以使用swift保留的關(guān)鍵字作為常量或者變量名,你可以使用反括號(hào)(`)將關(guān)鍵字包圍的方式將其作為名字使用,無(wú)論如何,你應(yīng)當(dāng)避免這種情況的發(fā)生。
分號(hào)的使用
大家都知道oc中一句話結(jié)束就是以分號(hào)作為標(biāo)志的,一行也可以寫多句,最終以分號(hào)隔開(kāi),如下所示。
self.view.backgroundColor = [UIColor lightGrayColor];
但是在swift中是不需要分號(hào)結(jié)尾的,當(dāng)然加上也不算錯(cuò) ,在一行上也可以寫多句,這個(gè)時(shí)候就需要使用分號(hào)將每一句隔開(kāi)。
//這個(gè)就是我定義的一個(gè)不可變數(shù)組
let numbers = [20, 15, 18, 9]
整數(shù)
swift中整數(shù)與C一樣提供了8、16、32、64位的有符號(hào)和無(wú)符號(hào)整形數(shù)據(jù),分別命名為uInt8、uInt32、uInt64。
它們都有一定的表示范圍,不同整數(shù)類型的min和max屬性都可以獲取對(duì)應(yīng)類型的最大值和最小值。下面我們就看一下UInt8數(shù)據(jù)類型的范圍。
//UInt8最小值
let minValue = UInt8.min
//UInt8最大值
let maxValue = UInt8.max
print(minValue)
print(maxValue)
下面看輸出結(jié)果
0
255
1. Int
swift中,不需要你專門指定整數(shù)的長(zhǎng)度,提供了一個(gè)特殊的整數(shù)類型Int,長(zhǎng)度與當(dāng)前平臺(tái)的原生字長(zhǎng)相同。
- 32位平臺(tái)上,
Int與Int32長(zhǎng)度相同。 - 64位平臺(tái)上,
Int與Int64長(zhǎng)度相同。
2. UInt
swift也提供了一個(gè)特殊的無(wú)符號(hào)類型UInt,長(zhǎng)度與當(dāng)前平臺(tái)的原生字長(zhǎng)相同。
- 32位平臺(tái)上,
UInt與UInt32長(zhǎng)度相同。 - 64位平臺(tái)上,
UInt與UInt64長(zhǎng)度相同。
注意:盡量不要使用UInt,除非你真的需要存儲(chǔ)一個(gè)和當(dāng)前平臺(tái)原生字長(zhǎng)相同的無(wú)符號(hào)整數(shù),除了這種情況,最好使用Int,即使你要存儲(chǔ)的值已知是非負(fù)的,統(tǒng)一使用Int可以提高代碼的可復(fù)用性,避免不同數(shù)據(jù)類型之間的轉(zhuǎn)換。
浮點(diǎn)數(shù)
浮點(diǎn)數(shù)比整數(shù)類型表示的范圍更大,可以存儲(chǔ)比Int類型更大或者更小的數(shù)字,Swift中提供了兩種有符號(hào)浮點(diǎn)數(shù)類型。
-
Double表示64位浮點(diǎn)數(shù),適合存儲(chǔ)很大或者精度很高的浮點(diǎn)數(shù)。 -
Float表示32位浮點(diǎn)數(shù),精度要求不高的話可以使用此類型。
類型安全和類型推斷
??swift是一個(gè)類型安全(type safe)的語(yǔ)言,類型安全的語(yǔ)言會(huì)清楚的知道代碼要處理的值類型,如果你的代碼需要一個(gè)String,你絕對(duì)不可能不小心傳入一個(gè)Int。
??對(duì)于數(shù)據(jù)類型的檢查,會(huì)在編譯代碼的時(shí)候進(jìn)行。類型檢查可以幫助避免錯(cuò)誤,但是不是每次聲明常量或者變量的時(shí)候都需要顯式指定而理性,如果沒(méi)有顯式指定類型,swift會(huì)自動(dòng)進(jìn)行類型推斷type inference來(lái)選擇合適的類型??聪旅娴拇a。
let length = 42
對(duì)于這句代碼swift會(huì)自動(dòng)的推斷為整型數(shù)字。但是當(dāng)推斷浮點(diǎn)型數(shù)字的時(shí)候,swift一般都是會(huì)推斷為double。
數(shù)值型字面量
整數(shù)的字面量可以寫作如下。
- 一個(gè)十進(jìn)制數(shù),沒(méi)有前綴
- 一個(gè)二進(jìn)制數(shù),前綴是
0b - 一個(gè)八進(jìn)制數(shù),前綴是
0o - 一個(gè)十六進(jìn)制數(shù),前綴是
0x
在看一下下面的代碼。
//整數(shù)的字面量
let decimalInteger = 17
let binaryInteger = 0b10001 //二進(jìn)制17
let octalInteger = 0o21 //八進(jìn)制17
let hexadecimalInteger = 0x11 //十六進(jìn)制17
大家可以看到,上面的數(shù)字轉(zhuǎn)化為十進(jìn)制數(shù)據(jù),都是17。
浮點(diǎn)字面量可以是十進(jìn)制(沒(méi)有前綴)或者是十六進(jìn)制(前綴是0x),小數(shù)點(diǎn)兩邊必須有至少一個(gè)十進(jìn)制數(shù)字(或者十六進(jìn)制數(shù)字)。浮點(diǎn)字面量還有一個(gè)可選的指數(shù)exponent,在十進(jìn)制浮點(diǎn)數(shù)中通過(guò)大寫或者小寫的e來(lái)指定,在十六進(jìn)制浮點(diǎn)數(shù)中通過(guò)大寫或者小寫的p來(lái)指定。
如果一個(gè)十進(jìn)制數(shù)的指數(shù)為exp,那這個(gè)數(shù)相當(dāng)于基數(shù)和10^exp的乘積
-
1.25e2表示1.25 * 10^2,等于125.0 -
1.25e-2表示1.25 * 10^-2,等于0.0125
如果一個(gè)十六進(jìn)制數(shù)的指數(shù)為exp,那這個(gè)數(shù)相當(dāng)于基數(shù)和2^exp的乘積
-
0xFp2表示15 * 2^2,等于60.0 -
0xFp-2表示15 * 2^-2,等于3.75
下面的這些浮點(diǎn)字面量都等于十進(jìn)制的12.1875
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
數(shù)值類字面量可以包括額外的格式來(lái)增強(qiáng)可讀性,整數(shù)和浮點(diǎn)數(shù)都可以添加額外的零并且包含下劃線,并不會(huì)影響自面量。
let doubleValue = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
數(shù)值類型轉(zhuǎn)換
一般來(lái)講,即使代碼中的整數(shù)常量和變量已知非負(fù),也請(qǐng)使用Int類型,總是使用默認(rèn)的整數(shù)而理性可以保證你的整數(shù)常量和變量可以直接被復(fù)用,并且可以匹配整數(shù)類字面量的類型推斷。
下面我們看不同整數(shù)類型之間的轉(zhuǎn)換。
1. 整數(shù)和整數(shù)之間的轉(zhuǎn)換
兩個(gè)不同類型的整形數(shù)據(jù)是不可以直接相加的,一定要進(jìn)行相應(yīng)的轉(zhuǎn)換,必須要用當(dāng)前值來(lái)初始化一個(gè)期望類型的新數(shù)字,這個(gè)數(shù)字的類型就是你的目標(biāo)類型。
看下面的代碼。
//整數(shù)之間的類型轉(zhuǎn)換
let oneNumber : UInt16 = 2_000
let twoNumber : UInt8 = 1;
let sum = oneNumber + UInt16(twoNumber)
print(sum)
下面看結(jié)果輸出。
2001
經(jīng)過(guò)轉(zhuǎn)換兩個(gè)數(shù)字都是UInt16類型的,就可以進(jìn)行相加了。
someType(ofInitialValue)是調(diào)用swift構(gòu)造器并傳入一個(gè)初始值的默認(rèn)方法,在語(yǔ)言內(nèi)部,UInt16有一個(gè)構(gòu)造器,可以接受一個(gè)UInt8類型的值,所以這個(gè)構(gòu)造器可以使用現(xiàn)有的UInt8來(lái)創(chuàng)建一個(gè)新的UInt16,注意,你并不能傳入任意類型的值,只能傳入UInt16內(nèi)部對(duì)應(yīng)構(gòu)造器的值,不過(guò)你可以擴(kuò)展現(xiàn)有的類型來(lái)讓它可以接收其他類型的值(包括自定義類型),用的就是擴(kuò)展,這個(gè)以后還會(huì)詳述。
2. 整數(shù)和浮點(diǎn)數(shù)的轉(zhuǎn)換
由于類型的不同,它們之間的轉(zhuǎn)換也要顯式的指定轉(zhuǎn)換類型。下面看下面的代碼。
//整數(shù)和浮點(diǎn)數(shù)之間的轉(zhuǎn)換
let one = 3
let pi = 3.14
let sum = Double(one) + pi
print(sum)
下面看輸出結(jié)果
6.14
注意:結(jié)合數(shù)字類常量和變量不同于結(jié)合數(shù)字類字面量,字面量3可以直接和字面量3.14相加,因?yàn)閿?shù)字字面量本身沒(méi)有明確類型,它們的類型只在編譯器需要求值的時(shí)候被推測(cè)。
后記
未完,待續(xù)~~~
