swift簡(jiǎn)單總結(jié)(七)—— 數(shù)據(jù)類型

版本記錄

版本號(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ù)類型的minmax屬性都可以獲取對(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)上,IntInt32長(zhǎng)度相同。
  • 64位平臺(tái)上,IntInt64長(zhǎng)度相同。

2. UInt

swift也提供了一個(gè)特殊的無(wú)符號(hào)類型UInt,長(zhǎng)度與當(dāng)前平臺(tái)的原生字長(zhǎng)相同。

  • 32位平臺(tái)上,UIntUInt32長(zhǎng)度相同。
  • 64位平臺(tái)上,UIntUInt64長(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ù)~~~

??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容