在iOS 10 和微信小程序的大浪潮下早敬,Swift 3 卻少有人提及忌傻,前不久,iOS開發(fā)者翹首以盼的Swift 3終于來了搁嗓, 就像很多人預(yù)測的一樣芯勘,Swift 3的API基本趨于穩(wěn)定,不會像以前一樣改動的太大腺逛,讓你無從下手荷愕,此時是最好的學(xué)習(xí)機會。盡管以前學(xué)習(xí)過部分棍矛,但決定重新梳理一下安疗,從頭開始,不積跬步無以至千里够委。入門學(xué)習(xí)資料荐类,應(yīng)該沒有比官方更靠譜的吧。The Swift Programming Language (Swift 3)
- 1 . 常量
let
如果你的代碼存儲的值不會改變茁帽,用
let
關(guān)鍵字聲明為常量玉罐。let聲明的值是不會再改變的,再次賦值會編譯不過
let maximumNumberOfLoginAttempts = 10
- 2 . 變量
var
聲明變量的關(guān)鍵值潘拨,如果你代碼中的值需要改變吊输,請用
var
關(guān)鍵字聲明為變量。
var currentLoginAttempt = 0
- 3 . 打印
print()
和OC中的
NSLog()
類似铁追,print("打印這個值 \\\\(值)")
季蚂。
- 4 .分號
;
不像許多其他語言,Swift并不要求你寫一個分號(;代碼中的每個語句后),當(dāng)然你也可以這樣做扭屁。然而算谈,分號在Swift中的用法是如果你想要在一行上寫多個獨立的語句時需要:
let cat = ""; print(cat)
- 5 .整數(shù)
整數(shù)全是數(shù)字,沒有小數(shù)部分料滥,如42和-23然眼。整數(shù)有符號類型(正,零或負(fù)的)或無符號類型(正或零)幔欧。Swift在8罪治,16,32位和64位的形式提供有符號和無符號整數(shù)礁蔗。這些整數(shù)遵循類似于C的命名約定觉义,在一個8位的無符號整數(shù)的類型為UInt8,一個32位帶符號整數(shù)的類型為Int32浴井。
- 5.1 .整數(shù)邊界
可以訪問整數(shù)類型的最小值和最大值min與max屬性:
let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
- 5.2 .INT類型
在大多數(shù)情況下晒骇,你不需要挑整數(shù)的特定大小在代碼中使用。Int磺浙,其具有的范圍與當(dāng)前平臺的位數(shù)相同:
在32位的平臺上洪囤,Int其大小與相同Int32。
在64位的平臺上撕氧,Int其大小與相同Int64瘤缩。
除非你有特殊的要求去限制整數(shù)的值,不然就不用特殊設(shè)置范圍伦泥。在32位平臺上剥啤,Int可以是-2,147,483,648和2,147,483,647的任意值,滿足大多數(shù)要求不脯,所以官方推薦直接使用Int府怯,不自己區(qū)分位數(shù)。
- 5.3 .UINT類型
與INT類型一致防楷,只是無符號類型而已牺丙,不能表達(dá)負(fù)數(shù)。官方推薦使用Int
- 6 .浮點型
Double,Float
浮點數(shù)是具有小數(shù)部分的數(shù)字复局,例如3.14159冲簿,0.1,和-273.15亿昏。在未聲明類型時峦剔,Swift默認(rèn)為Double.
Double 代表一個64位浮點數(shù)。
Float 表示32位浮點數(shù)龙优。
- 7 .類型安全和類型推斷
Swift是一個類型安全的語言。類型安全的語言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼的一部分需要一個String彤断,你傳遞一個Int會直接報錯野舶。因為它會在編譯你的代碼時進(jìn)行類型檢查,并把不匹配的類型標(biāo)記為錯誤宰衙。這可以讓你在開發(fā)的時候盡早發(fā)現(xiàn)并修復(fù)錯誤平道。
let meaningOfLife = 42 //類型推斷為int
let pi = 3.14159 //類型推斷為double
let anotherPi = 3 + 0.14159 //類型推斷為double
- 8 . 數(shù)字表示
十進(jìn)制數(shù),沒有前綴
let decimalInteger = 17
二進(jìn)制數(shù)供炼,用0b前綴let binaryInteger = 0b10001
八進(jìn)制數(shù)一屋,有0o前綴let octalInteger = 0o21
十六進(jìn)制數(shù),用0x前綴let hexadecimalInteger = 0x11
當(dāng)然你也可以這樣寫let oneMillion = 1_000_000
和let oneMillion = 1000000
等價
- 9 .數(shù)字類型轉(zhuǎn)換
在Swift中不同類型的數(shù)字不能直接運算袋哼,在編譯期就會提示錯誤信息給你冀墨,防止隱藏的轉(zhuǎn)換錯誤
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
錯誤示例:let twoThousandAndOne = twoThousand + one
正確寫法:let twoThousandAndOne = twoThousand + UInt16(one)
let three = 3
let pointOneFourOneFiveNine = 0.14159
錯誤示例:let pi = three + pointOneFourOneFiveNine
正確寫法: let pi = Double(three) + pointOneFourOneFiveNine
- 10 .類型別名
typealias
類型別名即給現(xiàn)有的類型起個別的名字。關(guān)鍵字為typealias涛贯。
typealias AudioSample = UInt16 //給UInt16起個別名AudioSample
var maxAmplitudeFound = AudioSample.min //AudioSample.min等價于UInt16.min诽嘉。
- 11.布爾值
true
false
提供了兩個布爾常量值,true和false弟翘,如果你在需要使用 Bool 類型的地方使用了非布爾值虫腋,Swift 的類型安全機制會報錯。
但是你可以這樣寫,i == 1 的比較結(jié)果是 Bool 類型稀余,可以通過類型檢查
let i = 1
if i == 1 {
// this example will compile successfully
}
- 12 .元組
元組做的事情就是把多個值組合成一個復(fù)合值悦冀。元組內(nèi)的值可以是任意類型,并不要求是相同類型睛琳。和OC中的數(shù)組類似
- 12.1 組合
你可以把任意順序的類型組合成一個元組盒蟆,這個元組可以包含所有類型。只要你想掸掏,你可以創(chuàng)建一個類型為 (Int, Int, Int) 或者 (String, Bool) 或者其他任何你想要的組合的元組茁影。
let http404Error = (404, "Not Found")
// http404Error 的類型是 (Int, String),值是 (404, "Not Found")
- 12.2 分解
你可以將一個元組的內(nèi)容分解(decompose)成單獨的常量和變量丧凤,然后你就可以正常使用它們了
let (statusCode, statusMessage) = http404Error
print("The status code is \\\\(statusCode)")
// 輸出 "The status code is 404"
print("The status message is \\\\(statusMessage)")
// 輸出 "The status message is Not Found"
- 12.3 忽略
如果你只需要一部分元組值募闲,分解的時候可以把要忽略的部分用下劃線(_)標(biāo)記:
let (justTheStatusCode, _) = http404Error
print("The status code is \\\\(justTheStatusCode)")
// 輸出 "The status code is 404"
- 12.4 下標(biāo)訪問
此外,你還可以通過下標(biāo)來訪問元組中的單個元素愿待,下標(biāo)從零開始:
print("The status code is \\\\(http404Error.0)")
// 輸出 "The status code is 404"
print("The status message is \\\\(http404Error.1)")
// 輸出 "The status message is Not Found"
- 12.5 命名獲取
你可以在定義元組的時候給單個元素命名,給元組中的元素命名后浩螺,你可以通過名字來獲取這些元素的值:
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \\\\(http200Status.statusCode)")
// 輸出 "The status code is 200"
print("The status message is \\\\(http200Status.description)")
// 輸出 "The status message is OK"
可變元祖是可以賦值的,但在賦值時仍侥,可變元組雖然可以修改數(shù)據(jù)要出,但卻不能改變其數(shù)據(jù)的數(shù)據(jù)類型:如下
- 13 .可選類型
optionals
C 和 Objective-C 中并沒有可選類型這個概念。最接近的是 Objective-C 中的一個特性农渊,一個方法要么返回一個對象要么返回nil患蹂,nil表示“缺少一個合法的對象”。然而,這只對對象起作用——對于結(jié)構(gòu)體传于,基本的 C 類型或者枚舉類型不起作用囱挑。對于這些類型,Objective-C 方法一般會返回一個特殊值(比如NSNotFound)來暗示值缺失沼溜。這種方法假設(shè)方法的調(diào)用者知道并記得對特殊值進(jìn)行判斷平挑。然而,Swift 的可選類型可以讓你暗示任意類型的值缺失系草,并不需要一個特殊值通熄。
來看一個例子。Swift 的 Int 類型有一種構(gòu)造器找都,作用是將一個 String 值轉(zhuǎn)換成一個 Int 值唇辨。然而,并不是所有的字符串都可以轉(zhuǎn)換成一個整數(shù)檐嚣。字符串 "123" 可以被轉(zhuǎn)換成數(shù)字 123 助泽,但是字符串 "hello, world" 不行。下面的例子使用這種構(gòu)造器來嘗試將一個 String 轉(zhuǎn)換成 Int:
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推測為類型 "Int?"嚎京, 或者類型 "optional Int"
- 14 .nil
Swift 的 nil 和 Objective-C 中的 nil 并不一樣嗡贺。在 Objective-C 中,nil 是一個指向不存在對象的指針鞍帝。在 Swift 中诫睬,nil 不是指針——它是一個確定的值,用來表示值缺失帕涌。任何類型的可選狀態(tài)都可以被設(shè)置為 nil摄凡,不只是對象類型蚓曼。
- 14.1 賦值
你可以給可選變量賦值為nil來表示它沒有值,但nil不能用于非可選的常量和變量亲澡。
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
- 14.2 聲明
如果你聲明一個可選常量或者變量但是沒有賦值,它們會自動被設(shè)置為 nil:
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
- 15 .if 語句以及強制解析
你可以使用 if 語句和 nil 比較其弊,來判斷一個可選值是否包含值痹雅。你可以使用“相等”(==)或“不等”(!=)來執(zhí)行比較。
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."
當(dāng)你確定可選類型確實包含值之后项鬼,你可以在可選的名字后面加一個感嘆號(!)來獲取值。這個驚嘆號表示你知道這個可選有值劲阎,稱為可選值的強制解析(官方文檔的forced unwrapping):
if convertedNumber != nil {
print("convertedNumber has an integer value of \\\\(convertedNumber!).")
}
// Prints "convertedNumber has an integer value of 123."
- 16 . 可選綁定
optional binding
使用可選綁定來判斷可選類型是否包含值,如果包含就把值賦給一個臨時常量或者變量鸠真∶跸桑可選綁定可以用在 if 和 while 語句中,這種用法不僅可以用來判斷可選類型中是否有值吠卷,同時可以將可選類型中的值賦給一個常量或者變量锡垄。
if let constantName = someOptional {
statements
}
使用可選綁定來重寫 possibleNumber
if let actualNumber = Int(possibleNumber) {
print("\\\\"\\\\(possibleNumber)\\\\" has an integer value of \\\\(actualNumber)")
} else {
print("\\\\"\\\\(possibleNumber)\\\\" could not be converted to an integer")
}
解讀:如果Int(possibleNumber)
返回的可選 Int 包含一個值,就創(chuàng)建一個叫做 actualNumber
的新常量并將可選包含的值賦給它祭隔。
如果轉(zhuǎn)換成功货岭,actualNumber
常量可以在 if 語句的第一個分支中使用。它已經(jīng)被可選類型 包含的 值初始化過疾渴,所以不需要再使用 ! 后綴來獲取它的值千贯。在這個例子中,actualNumber
只被用來輸出轉(zhuǎn)換結(jié)果搞坝。
你可以在可選綁定中使用常量和變量搔谴。如果你想在if語句的第一個分支中操作 actualNumber
的值,你可以改成if var actualNumbe
r桩撮,這樣可選類型包含的值就會被賦給一個變量而非常量敦第。
- 17 .隱式解析可選類型
implicitly unwrapped optionals
如上所述,可選類型暗示了常量或者變量可以“沒有值”店量∥吖可選可以通過 if 語句來判斷是否有值,如果有值的話可以通過可選綁定來解析值融师。
有時候在程序架構(gòu)中右钾,第一次被賦值之后,可以確定一個可選類型總會有值诬滩。在這種情況下霹粥,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值疼鸟。這種類型的可選狀態(tài)被定義為隱式解析可選類型后控。把想要用作可選類型的后面的問號(String?)改成感嘆號(String!)來聲明一個隱式解析可選類型。
當(dāng)可選類型被第一次賦值之后就可以確定之后一直有值的時候空镜,隱式解析可選類型非常有用浩淘。隱式解析可選類型主要被用在 Swift 中類的構(gòu)造過程中捌朴。一個隱式解析可選類型其實就是一個普通的可選類型,但是可以被當(dāng)做非可選類型來使用张抄,并不需要每次都使用解析來獲取可選值砂蔽。下面的例子展示了可選類型 String 和隱式解析可選類型 String 之間的區(qū)別:
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark
/*****下面是隱式解析可選類型 String *****/
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark
如果你在隱式解析可選類型沒有值的時候嘗試取值,會觸發(fā)運行時錯誤署惯。和你在沒有值的普通可選類型后面加一個驚嘆號一樣左驾。
所以你可以把隱式解析可選類型當(dāng)做普通可選類型來判斷它是否包含值:
if assumedString != nil {
print(assumedString)
}
// Prints "An implicitly unwrapped optional string."
你也可以在可選綁定中使用隱式解析可選類型來檢查并解析它的值:
if let definiteString = assumedString {
print(definiteString)
}
// Prints "An implicitly unwrapped optional string."
如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型。如果你需要在變量的生命周期中判斷是否是nil的話极谊,請使用普通可選類型诡右。
可選類型 | 解讀
----|------|----
普通可選類型 | 可選類型可以讓你暗示任意類型的值缺失,并不需要一個特殊值轻猖。當(dāng)你不確定你所賦予的那個值時帆吻,就用(String?)即 (類型?)。
隱式解析可選類型 | 在第一次被賦值之后咙边,可以確定一個可選類型總會有值猜煮,把想要用作可選類型的后面的問號(String?)改成感嘆號(String!)來聲明一個隱式解析可選類型。本質(zhì)是普通可選類型败许,只是當(dāng)做當(dāng)做非可選類型來使用王带。
- 17 .斷言
assert()
可選類型可以讓你判斷值是否存在,你可以在代碼中處理值缺失的情況市殷。然而辫秧,在某些情況下,如果值缺失或者值并不滿足特定的條件被丧,你的代碼可能沒辦法繼續(xù)執(zhí)行盟戏。這時,你可以在你的代碼中觸發(fā)一個 斷言 來結(jié)束代碼運行并通過調(diào)試來找到值缺失的原因甥桂。給你一個代碼調(diào)試工具 ,看個人喜好使用柿究。不滿足條件時會斷點打印,會定位到具體錯誤行數(shù)黄选,僅為DEBUG模式蝇摸。
控制臺需要斷言信息
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// this causes the assertion to trigger, because age is not >= 0
控制臺不需要斷言信息
let age = -3
assert(age >= 0)
以上只是一些簡單的概念說(fan)明(yi),如有錯誤請指正办陷,謝謝貌夕。Swift 3 學(xué)習(xí) ,后續(xù)會不斷更新民镜。
如果你覺得我的文章對你有幫助請點喜歡哦啡专,也可以關(guān)注我,每周至少一篇技術(shù)更新制圈。
或者關(guān)注 我的專題 每周至少5篇高質(zhì)量文章收錄们童,多謝支持畔况。
一起學(xué)習(xí),一起進(jìn)步慧库。