swift類型

整數(shù)

有符號(hào)和無(wú)符號(hào)類型兩種,根據(jù)有效位又有8 16 32 64的區(qū)別,Int、UInt8等,Int是一個(gè)語(yǔ)法糖,Xcode會(huì)根據(jù)運(yùn)行平臺(tái)來(lái)決定是32位還是64位,所以在進(jìn)行存儲(chǔ)型屬性賦值時(shí)可以不用顯示聲明數(shù)據(jù)類型(計(jì)算型需要)如let count = 10,因此如果需要制定特定類型那么聲明一個(gè)值時(shí)最好是加上其類型為好。

數(shù)值范圍直接調(diào)用(.min)和(.max)即可

浮點(diǎn)數(shù)

根據(jù)精度有Float和Double兩種,前者是32位浮點(diǎn),有效精度6位,后者64位浮點(diǎn),有效精度15位,在兩者都符合時(shí),Double最好。這也是let money = 3.25時(shí)默認(rèn)推斷為Double類型的原因

補(bǔ)充:

1.因?yàn)閟wift是強(qiáng)類型語(yǔ)言,因此一個(gè)函數(shù)如果參數(shù)制定為String,傳入一個(gè)Int類型則會(huì)報(bào)錯(cuò)。當(dāng)然特殊情況下如果需要適配多種類型,則有泛型和父類等選擇可用。

2.數(shù)值型字面量,主要是進(jìn)制顯示,如二進(jìn)制,八進(jìn)制,16進(jìn)制以及默認(rèn)的十進(jìn)制

( 浮點(diǎn)字面量可以是十進(jìn)制(沒(méi)有前綴)或者是十六進(jìn)制(前綴是?0x?)。小數(shù)點(diǎn)兩邊必須有至少一個(gè)十進(jìn)制數(shù)字(或者是十六進(jìn)制的數(shù)字)。十進(jìn)制浮點(diǎn)數(shù)也可以有一個(gè)可選的指數(shù)(exponent),通過(guò)大寫或者小寫的?e?來(lái)指定;十六進(jìn)制浮點(diǎn)數(shù)必須有一個(gè)指數(shù),通過(guò)大寫或者小寫的?p?來(lái)指定 )

一個(gè)十進(jìn)制數(shù),沒(méi)有前綴

一個(gè)二進(jìn)制數(shù),前綴是0b

一個(gè)八進(jìn)制數(shù),前綴是0o

一個(gè)十六進(jìn)制數(shù),前綴是0x

3.數(shù)值轉(zhuǎn)換,如Int8轉(zhuǎn)為Int,一般是低位數(shù)類型網(wǎng)高位數(shù)轉(zhuǎn)換,如果是Int轉(zhuǎn)Int8則會(huì)報(bào)錯(cuò),原因就是有效位數(shù)問(wèn)題,聯(lián)想OC中的數(shù)值溢出。swift為了防止類似問(wèn)題,在類型使用時(shí)會(huì)做檢查,如果是動(dòng)態(tài)計(jì)算時(shí),則還是會(huì)有這個(gè)問(wèn)題存在,因此才會(huì)首選推薦使用Int和Double類型

布爾類型

邏輯常量,true和false兩個(gè),OC以前的布爾值并不純粹,因?yàn)榭梢员粡?qiáng)轉(zhuǎn),,,

元組

這個(gè)就是可以放不同類型的數(shù)組,并且元組可以作為函數(shù)返回值,這樣OC以前想要在一個(gè)方法中返回多個(gè)數(shù)值只能通過(guò)block或者返回一個(gè)封裝好對(duì)象或者是字典的痛苦就沒(méi)有了,swift中很優(yōu)雅的使用元組返回即可,如下:

let http404Error = (404,"Not Found")

元組定義時(shí)可以加上命名,如let http200Status = (statusCode:200, description:"OK")

數(shù)組:

OC中時(shí)NSArray,swift中時(shí)Array,NSArray可以直接互轉(zhuǎn)Array,使用as即可,這個(gè)是官方做的處理

swift數(shù)組的類型: [Int] 或者 Array

swift中Array創(chuàng)建有多種方式:

var someArray1 = [String](repeatElement("123", count: 3))? //類型是字符串,默認(rèn)是123 長(zhǎng)度是3

var someArray2 = ["123","123","123"]

var someArray3 : [String]=["123","123","123"]

var emptyArray = [Int]()

補(bǔ)充:

1.數(shù)組類型如果是var來(lái)聲明則是可變數(shù)組,let聲明則是不可變數(shù)組

2.數(shù)組的操作方法(.count? .first? .last? .isEmpty? .min()? .max()? .contains()? .index(of:) )

3.數(shù)組的遍歷

4.開閉區(qū)間 0...5說(shuō)明是0到5,包含5; 0..<5則是0到5,不包含5,數(shù)組中常用到numbers[2..<numbers.count]

5.數(shù)組遍歷,和java的foreach遍歷一樣

for index in 0..<numbers[index] {

}

for number in numbers{

? ? print(number)

}

for (index, vowel) in vowels.enumerated() {

? ? //遍歷數(shù)組索引和元素? ? print("\(index+1): \(vowel)")

}

6.對(duì)可變數(shù)組的操作(var聲明的)

.append()? ?.insert()? ?removeLast()? removeFirst()? ?removeAtIndex()? ?remove(at:)? removeRange()? removeAll()? +=(這個(gè)是操作符重載)

7.NSArray是一個(gè)類,Array是一個(gè)結(jié)構(gòu)體如圖:

字典

swift字典Dictionary和OC的NSDictionary也是可以直接轉(zhuǎn)換,使用as即可。

swift字典類型Dictionary<String, String>()或者 [String: String]()

創(chuàng)建方式多種:

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]

var dict1 : [String: NSObject] = [String: NSObject]()

let dict2 = ["name":"why","age":18]

var dictM = [String: AnyObject]()

補(bǔ)充:

1.可變與不可變是通過(guò)聲明時(shí)var或者let來(lái)判定的

2.字典操作方法(dictM["name"] ="why"? ?.removeValueForKey()? )

3.字典遍歷

for key in dictM.keys {

????print(key)

}

for value in dictM.values {

????print(value)

}

for (key, value) in dic1 {

????print(key)

????print(value)

}

4.字典合并,不可想數(shù)組一樣直接 +操作,切記切記

for(key, value)in dic2 {

?????dic1[key] = value

}

5.和數(shù)組一樣,swift字典也是一個(gè)struct,NSDictionary是一個(gè)類

6.struct和enum是數(shù)值類型,所以傳遞時(shí)都會(huì)被拷貝一份如下圖:

arr2和arr1并不是指向一個(gè)數(shù)組,arr2是直接拷貝了一份數(shù)據(jù)過(guò)去,因而編譯器也給了提示,arr1并沒(méi)有進(jìn)行可變操作,使用let聲明即可。字典也是一樣的,這個(gè)和OC中的NSArray使用方式有區(qū)別,切記切記(因各自的本質(zhì)不同,一個(gè)是對(duì)象,一個(gè)是struct)

結(jié)構(gòu)體:

swift中類和結(jié)構(gòu)體聯(lián)系很密切,也可以在大多數(shù)場(chǎng)景進(jìn)行互換使用,例如數(shù)據(jù)解析的model可以使用對(duì)象也可以使用struct來(lái)進(jìn)行使用。都有如下特性:

1.定義屬性用于存儲(chǔ)值

2.定義方法用于提供功能

3.定義下標(biāo)操作使得可以通過(guò)下標(biāo)語(yǔ)法來(lái)訪問(wèn)實(shí)例所包含的值

4.定義構(gòu)造器用于生成初始化值

5.通過(guò)擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能

6.實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能


不過(guò)swift中更偏愛(ài)使用struct來(lái)替代對(duì)象的使用,這一點(diǎn)和go語(yǔ)言很像。struct值類型,分配在內(nèi)存中,對(duì)象分配在堆中。因而go作為服務(wù)器語(yǔ)言,優(yōu)先考慮內(nèi)存中的特性,因?yàn)楦臁?/p>

棧是程序啟動(dòng)的時(shí)候,系統(tǒng)事先分配的,使用過(guò)程中,系統(tǒng)不干預(yù);堆是用的時(shí)候才向系統(tǒng)申請(qǐng)的,用完了需要交還,這個(gè)申請(qǐng)和交還的過(guò)程開銷相對(duì)就比較大了。

棧是編譯時(shí)分配空間,而堆是動(dòng)態(tài)分配(運(yùn)行時(shí)分配空間),所以棧的速度快

swift中struct不可繼承,賦值時(shí)是淺拷貝,也就是直接復(fù)制一份同樣的數(shù)據(jù),對(duì)象賦值時(shí)是深拷貝,直接傳遞指針過(guò)去。此外如果要修改struct中屬性,需要添加mutating方法如:

? ??mutating?func changeData(vaule: Int)? {?

?????????self.Data= vaule

? ? }

swift中提供了恒等判斷:因?yàn)轭愂且妙愋停锌赡苡卸鄠€(gè)常量和變量在幕后同時(shí)引用同一個(gè)類實(shí)例。值類型用不到這些如枚舉,結(jié)構(gòu)都是值類型,不是對(duì)象類型

===? ?等價(jià)于”表示兩個(gè)類類型(class type)的常量或者變量引用同一個(gè)類實(shí)例

==? 等于”表示兩個(gè)實(shí)例的值“相等”或“相同”,判定時(shí)要遵照設(shè)計(jì)者定義的評(píng)判標(biāo)準(zhǔn)

枚舉:

枚舉為一組相關(guān)的值定義了一個(gè)共同的類型,使你可以在你的代碼中以類型安全的方式來(lái)使用這些值。也就是枚舉中各值可以是不同類型,這個(gè)和OC枚舉是不一樣的,此外枚舉也對(duì)每個(gè)case的值做了一層包裝,要直接訪問(wèn)原始值需要.rawValue來(lái)進(jìn)行訪問(wèn),也可以對(duì)rawValue進(jìn)行重寫來(lái)確定如何返回原始值

如圖:

聲明:

enum? CompassPoint{

????case north? = 1

????case south

????case east

????case west

}

也可以預(yù)先填充值如

補(bǔ)充:

1.關(guān)聯(lián)值如下:

enum Barcode{

????case upc(Int,Int,Int,Int)

????case qrCode(String)

}

“定義一個(gè)名為Barcode的枚舉類型,它的一個(gè)成員值是具有(Int,Int,Int,Int)類型關(guān)聯(lián)值的upc,另一個(gè)成員值是具有String類型關(guān)聯(lián)值的qrCode?!?/p>

使用時(shí)可以是:

var productBarcode = Barcode.upc(8, 85909, 51226, 3)

2.原始值:

枚舉成員可以被默認(rèn)值(稱為原始值)預(yù)填充,這些原始值的類型必須相同;

原始值可以是字符串,字符,或者任意整型值或浮點(diǎn)型值。每個(gè)原始值在枚舉聲明中必須是唯一的

enum ASCIIControlCharacter:Character{

????case tab ="\t"

????case lineFeed ="\n"

????case carriageReturn ="\r"

}

原始值和關(guān)聯(lián)值是不同的。原始值是在定義枚舉時(shí)被預(yù)先填充的值,像上述三個(gè) ASCII 碼。對(duì)于一個(gè)特定的枚舉成員,它的原始值始終不變。關(guān)聯(lián)值是創(chuàng)建一個(gè)基于枚舉成員的常量或變量時(shí)才設(shè)置的值,枚舉成員的關(guān)聯(lián)值可以變化

在使用原始值為整數(shù)或者字符串類型的枚舉時(shí),不需要顯式地為每一個(gè)枚舉成員設(shè)置原始值,Swift 將會(huì)自動(dòng)為你賦值

3.遞歸枚舉

它有一個(gè)或多個(gè)枚舉成員使用該枚舉類型的實(shí)例作為關(guān)聯(lián)值。使用遞歸枚舉時(shí),編譯器會(huì)插入一個(gè)間接層。你可以在枚舉成員前加上indirect來(lái)表示該成員可遞歸

enum? ArithmeticExpression{

????case? number(Int)

?????indirect? caseaddition(ArithmeticExpression, ArithmeticExpression)

?????indirect? casemultiplication(ArithmeticExpression, ArithmeticExpression)

}

可選類型:

用來(lái)處理值可能缺失的情況,聯(lián)想OC中的對(duì)象nil判斷和數(shù)值的NSNotFound,swift則將兩者合一,直接使用optical包含了兩種情況

Swift 中,nil?不是指針——它是一個(gè)確定的值,用來(lái)表示值缺失。任何類型的可選狀態(tài)都可以被設(shè)置為?nil,不只是對(duì)象類型

在 Objective-C 中,nil?是一個(gè)指向不存在對(duì)象的指針

補(bǔ)充:

1.可選類型強(qiáng)制解析( !),使用強(qiáng)制解析先判斷是否空,否則易崩潰

2.可選綁定,主要是用來(lái)簡(jiǎn)化判斷代碼

if let constantName = someOptional {

?????statements

}

3.在if條件判斷中如果是多個(gè)條件用(,)號(hào)隔開,則表明是&&同義

if letfirstNumber =Int("4"),? letsecondNumber =Int("42"), firstNumber < secondNumber && secondNumber <100 {

????print("\(firstNumber)<\(secondNumber)< 100")

}

如下圖:

前者count<3是false, 后者abs <3為true,但是結(jié)果是打印了下面的,因此逗號(hào)隔開與&&同義,只是一個(gè)簡(jiǎn)單寫法而已。??

這個(gè)真想吐槽,寫法太自由了容易導(dǎo)致代碼閱讀困難

4.隱式解析可以減少判斷代碼,如session?.riskFunc(),這樣相當(dāng)于對(duì)session做了一次解析并且判斷,只有session不為空時(shí)才會(huì)執(zhí)行后面的riskFunc()方法

類型別名:

typealias和OC的typedef一樣,別名,方便代碼可讀性。常用用法有block命名,對(duì)系統(tǒng)空間進(jìn)行別名處理,這樣來(lái)進(jìn)行第三方庫(kù)等的庫(kù)內(nèi)控件名字區(qū)分如圖:


kingfisher的源碼


20180412

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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