Swift 3 學(xué)習(xí)-01

Swift 3.png

在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ù)龙优。


6.0.png
  • 7 .類型安全和類型推斷

Swift是一個類型安全的語言。類型安全的語言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼的一部分需要一個String彤断,你傳遞一個Int會直接報錯野舶。因為它會在編譯你的代碼時進(jìn)行類型檢查,并把不匹配的類型標(biāo)記為錯誤宰衙。這可以讓你在開發(fā)的時候盡早發(fā)現(xiàn)并修復(fù)錯誤平道。


7.0.png
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_000let 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
9.0.png
  • 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 的類型安全機制會報錯。


11.0.png

但是你可以這樣寫,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ù)類型:如下


12.5.png
  • 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"
13.0.png
  • 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 actualNumber桩撮,這樣可選類型包含的值就會被賦給一個變量而非常量敦第。

  • 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模式蝇摸。


17.0.png

控制臺需要斷言信息

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)步慧库。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跷跪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子齐板,更是在濱河造成了極大的恐慌吵瞻,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甘磨,死亡現(xiàn)場離奇詭異听皿,居然都是意外死亡,警方通過查閱死者的電腦和手機宽档,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庵朝,“玉大人吗冤,你說我怎么就攤上這事【鸥” “怎么了椎瘟?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侄旬。 經(jīng)常有香客問我肺蔚,道長,這世上最難降的妖魔是什么儡羔? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任宣羊,我火速辦了婚禮,結(jié)果婚禮上汰蜘,老公的妹妹穿的比我還像新娘仇冯。我一直安慰自己,他們只是感情好族操,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布苛坚。 她就那樣靜靜地躺著,像睡著了一般色难。 火紅的嫁衣襯著肌膚如雪泼舱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天枷莉,我揣著相機與錄音娇昙,去河邊找鬼。 笑死笤妙,一個胖子當(dāng)著我的面吹牛涯贞,可吹牛的內(nèi)容都是我干的枪狂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宋渔,長吁一口氣:“原來是場噩夢啊……” “哼州疾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起皇拣,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤严蓖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氧急,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颗胡,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年吩坝,在試婚紗的時候發(fā)現(xiàn)自己被綠了毒姨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钉寝,死狀恐怖弧呐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嵌纲,我是刑警寧澤俘枫,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站逮走,受9級特大地震影響鸠蚪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜师溅,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一茅信、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧墓臭,春花似錦汹押、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榆综,卻和暖如春妙痹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鼻疮。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工怯伊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人判沟。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓耿芹,卻偏偏與公主長得像崭篡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吧秕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于 Swift 重要這個文檔所包含的準(zhǔn)備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的琉闪。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,299評論 1 27
  • 基礎(chǔ)部分(The Basics) 當(dāng)推斷浮點數(shù)的類型時,Swift 總是會選擇Double而不是Float砸彬。 結(jié)合...
    gamper閱讀 1,286評論 0 7
  • Swift 是一門開發(fā) iOS, macOS, watchOS 和 tvOS 應(yīng)用的新語言颠毙。然而,如果你有 C 或...
    XLsn0w閱讀 922評論 2 1
  • 01-常量與變量 學(xué)習(xí)swift第一步打印Hello World print("Hello World") swi...
    iOS_恒仔閱讀 5,146評論 2 19
  • 1.古詩打卡 今天書本內(nèi)容只復(fù)習(xí)了《人日思?xì)w》砂碉,不過蛀蜜,今天古詩群里有中秋吟詩活動,娃娃和我一起應(yīng)景學(xué)著念了一首詠中...
    Hisi閱讀 165評論 0 0