基礎(chǔ)部分
簡(jiǎn)介
基本數(shù)據(jù)類(lèi)型
Int : 整型
Double蜒简、Float : 浮點(diǎn)型卷仑。
Bool : 布爾型尸饺。
String :文本型數(shù)據(jù)。
Array眉菱、Set迹栓、Dictionary : 集合類(lèi)型。
Tuple : 元組俭缓。
Optional :可選類(lèi)型克伊。
常量和變量
let : 來(lái)聲明常量。
var : 來(lái)聲明變量华坦。
let maxmunNumberOfLoginAttempts = 10 //常量
var currentLoginAttempt = 0 //變量
類(lèi)型標(biāo)注
//聲明一個(gè)類(lèi)型為String愿吹,名字為welcomeMessage的變量
var welcomeMessage: String
類(lèi)型安全和類(lèi)型推斷
類(lèi)型安全:類(lèi)型安全的語(yǔ)言可以讓你清楚地知道代碼要處理的值的類(lèi)型。編譯代碼的時(shí)候進(jìn)行類(lèi)型檢查惜姐,并把不匹配的標(biāo)記為錯(cuò)誤犁跪。
類(lèi)型推斷:聲明變量的時(shí)候并不一定要賦值和聲明類(lèi)型,類(lèi)型推斷會(huì)幫你確定合適的類(lèi)型。編譯器在編譯代碼的時(shí)候自動(dòng)推斷出表達(dá)式的類(lèi)型耘拇。原理:檢查賦值即可撵颊。
推斷浮點(diǎn)數(shù)的時(shí)候,swift 總會(huì)選擇Double, 而不選擇Float惫叛。
常量名和變量名
輸出常量和變量
func print(_ items: Any..., separator: String = default, terminator: String = default)
// items: 要輸出的0個(gè)或多個(gè)元素倡勇。
//separator: 每個(gè)item之間要打印的信息,默認(rèn)是" "
//terminator: 所有的item打印完成之后要輸出的信息嘉涌。默認(rèn)是換行"\n"
demo:
var name = "river li"
var age = 25
print("the current value of name is \(name), age is \(age)")
//the current value of name is river li, age is 25
注釋
多行注釋嵌套
/*
/*
var a = 12
var b = 25
*/
c = 45
*/
分號(hào)
不強(qiáng)制使用妻熊,但一行內(nèi)多有個(gè)語(yǔ)句必須使用分號(hào)隔開(kāi)。
數(shù)字可讀性增強(qiáng)
let a = 1000000
let a = 1_000_000
let b = 123.0012
let b = 000123.0012
整數(shù)轉(zhuǎn)化
- Swift 中不允許隱式的類(lèi)型轉(zhuǎn)換仑最。
- 字面量相加扔役,類(lèi)型推斷。
let c : Int16 = 5
let d : Int8 = 4
let e = c + d //錯(cuò)誤警医,編譯保存
print("c+d=\(e)")
let f = c + Int16(d) // 正確
print("c+d=\(f)")
let m = 3 + 12.3 //不報(bào)錯(cuò)亿胸, 類(lèi)型推斷
let h = d + 12.3 //報(bào)錯(cuò)12.3 被推斷成Double
類(lèi)型別名
typealias AudioSample = UInt16
布爾值
let right = true //Bool
let wrong = false //Bool
if right {
print("right")
}else{
print("wrong")
}
let i = 1
if i {
// 編譯報(bào)錯(cuò),i類(lèi)型推斷為Int類(lèi)型预皇,不是Bool類(lèi)型侈玄。if的判斷條件只能使用Bool類(lèi)型
}
if i==1 {
print("right")
}
元組
元組:把多個(gè)值組合成一個(gè)復(fù)合值。元組內(nèi)的值可以是任意類(lèi)型吟温,并不要求是同類(lèi)型的序仙。
let http404Error = (404, "Not Found")
元組內(nèi)容分解:
元組適合臨時(shí)組織值,不適合創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)鲁豪。
let(statusCode, statusMessage) = http404Error
print("The statusCode is \(statusCode)")
//The status code is 404
print("The statusMessage is \(statusMessage)")
//The status message is Not Found
let(statusCode, _) = http404Error //只取部分元組信息潘悼,不需要的使用_忽略
//使用下標(biāo)訪(fǎng)問(wèn)
let statusCode = http404Error.0
let statusMessage = http404Error.1
//定義元組指定元素名
let http200Status = (statusCode: 200, description: "OK")
//通過(guò)元素名稱(chēng)來(lái)獲取元素
let statusCode = http200Status.statusCode
let description = http200Status.description
可選類(lèi)型
使用可選類(lèi)型(optionals)來(lái)處理值可能缺失的情況。
Swift中的nil
? Swift中的nil和OC中的nil不一樣爬橡。OC中治唤,nil是一個(gè)指向不存在對(duì)象的指針。Swift中糙申,nil不是指針宾添,它是一個(gè)確定的值,用來(lái)表示缺失郭宝,任何類(lèi)型都可以被設(shè)置為nil辞槐,不只是對(duì)象類(lèi)型。
? nil不能用于不可選的常量和變量。如果代碼中有常量或者變量需要處理值缺失的情況呈队,請(qǐng)把它們聲明成對(duì)應(yīng)的可選類(lèi)型娜膘。
? 如果聲明一個(gè)可選常量或者變量但沒(méi)有賦值,它們會(huì)自動(dòng)被置為nil激挪。
Int(String) //將一個(gè)字符串轉(zhuǎn)換成整數(shù)命爬,要么能轉(zhuǎn)化成功"123", 要么轉(zhuǎn)化不成功"Hello"
let possibleNumber = "123"
let coverteNumber = Int(possibleNumber)
//返回值converteNumber被推斷為Int土匀? 或者 optional Int
Int? //? 暗示可能是Int值也可能不包含值锦爵。
let m : Int = nil //報(bào)錯(cuò)
let m : Int? //m默認(rèn)為nil
可選值的強(qiáng)制解析
當(dāng)你確定可選類(lèi)型有值之后舱殿,你可以在可選的名字后面加一個(gè)感嘆號(hào)(!)來(lái)獲取值。這個(gè)感嘆號(hào)表示“我知道這個(gè)可選有值险掀,請(qǐng)使用它”沪袭。這稱(chēng)謂“可選值的強(qiáng)制解析”
使用!來(lái)獲取一個(gè)不存在的可選值會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤樟氢。使用冈绊!來(lái)強(qiáng)制解析值之前,一定要確定可選包含一個(gè)非nil的值埠啃。
var a : Int?
a = 40
let b = !a
可選綁定
使用可選綁定來(lái)判斷可選類(lèi)型是否包含值死宣,如果包含就把值賦給一個(gè)臨時(shí)常量或者變量。
var a : Int? = 16
// 如果a包含可選值碴开,把值賦給b毅该,條件成立。如果a不包含可選值潦牛,則條件失敗
if let b = a {
print("b value is \(b)")
}else {
print("不能訪(fǎng)問(wèn)b")
}
隱式解析可選類(lèi)型
可選類(lèi)型暗示了常量或者變量可以"沒(méi)有值"眶掌。可選可以通過(guò)if來(lái)判斷是否有值罢绽,如果有值可以使用可選綁定來(lái)解析值畏线。
var a : Int?
if a == nil {
print("a 沒(méi)有值")
}
a = 12
if let c = a {
print("c=\(c)")
}
let possibleString: String? = "An optional String"
let forcedString: String = possibleString! //需要使用良价!
// 注意這里寝殴,不是問(wèn)號(hào)而是感嘆號(hào),這就是隱式解析可選類(lèi)型明垢,取值的時(shí)候不用加蚣常!
let assumedString: String! = "An implicatly unwrapped optinal string"
let implicitString: String = assumedString
一個(gè)隱式解析可選類(lèi)型其實(shí)就是一個(gè)普通的可選類(lèi)型。但可以當(dāng)做非可選類(lèi)型來(lái)使用痊银。并不需要每次都是用抵蚊!號(hào)來(lái)獲取值。
如果隱式解析可選類(lèi)型沒(méi)有值的時(shí)候嘗試讀取值會(huì)觸發(fā)運(yùn)行時(shí)錯(cuò)誤溯革。
錯(cuò)誤處理
fun canTrowAnError() throws {
//這個(gè)函數(shù)有可能拋出錯(cuò)誤贞绳。
}
一個(gè)函數(shù)可以通過(guò)聲明中添加throws關(guān)鍵字來(lái)拋出錯(cuò)誤消息,當(dāng)你的函數(shù)能拋出錯(cuò)誤消息時(shí)致稀,你應(yīng)該在表達(dá)式中前置try關(guān)鍵字
do{
try canTrowAnError()
}catch {
// 有一個(gè)錯(cuò)誤消息拋出
}
一個(gè)do語(yǔ)句創(chuàng)建了一個(gè)新的包含作用域冈闭,使得錯(cuò)誤能被傳播到一個(gè)或者多個(gè)catch語(yǔ)句中。
func makeASandwich() throws{
// ...
}
func eatASandwich() throws{
// ...
}
do {
try makeASandwich()
eatASandwich()
}catch SandWichError.outOfCleanDishes {
washDishes()
}catch SandWichError.missingIngredients(let ingredients){
buyGroceries(ingredients)
}
斷言
如果在值缺失或者值并不滿(mǎn)足特定條件的情況下抖单,你的代碼可能無(wú)法繼續(xù)執(zhí)行萎攒,這時(shí)遇八,你可以在你的代碼中觸發(fā)一個(gè)斷言,來(lái)結(jié)束代碼運(yùn)行耍休,并通過(guò)調(diào)試來(lái)找到問(wèn)題的原因刃永。
func assert(_ condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)
// condition 斷言條件
// message condition為false的時(shí)候觸發(fā)輸出message信息,默認(rèn)為空字符串
// file 如果斷言失敗羊精,則打印文件名斯够,默認(rèn)是該方法所處的文件。
// line 如果斷言失敗喧锦,則打印行號(hào)雳刺,默認(rèn)是該方法所處的行號(hào)。
當(dāng)代碼使用優(yōu)化編譯的時(shí)候裸违,斷言將會(huì)被禁用掖桦,Xcode的release模式下,斷言就會(huì)被禁用
何時(shí)使用斷言:
條件為假供汛,但需要條件為真的時(shí)候代碼才能繼續(xù)執(zhí)行枪汪。
斷言可能導(dǎo)致應(yīng)用終止,所以發(fā)布的時(shí)候一定要去掉斷言怔昨。