Swift 3.0之一而钞、 入門

1. 常量和變量

let 聲明常量, var 聲明變量。

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

多個常量或者變量聲明用逗號分隔:

var x = 0.0, y = 0.0, z = 0.0

2. 類型標注

冒號加空格 + 類型名

var welcomeMessage: String

多個常量或者變量聲明用逗號分隔:

var red, green, blue: Double

3. 命名常量和變量

命名規(guī)范:常量和變量的名字不能包含空白字符、數(shù)學符號、箭頭纹因、保留的(或者無效的)Unicode 碼位、連線和制表符鲫竞。也不能以數(shù)字開頭辐怕,盡管數(shù)字幾乎可以使用在名字其他的任何地方。

let π = 3.14159
let 你好 = "你好世界"
let ???? = "dogcow"

4. 輸出常量和變量

print(常量或變量名)
print("The current value of friendlyWelcome 
is \(常量或變量名)")

5. 注釋

1. // 這是一個注釋
2. /* 這也是
      一個
      注釋 */
3. /* 這是第一個多行注釋的開頭
   
   /* 這是第二個嵌套在內(nèi)的注釋塊 */
   
   這是第一個注釋塊的結(jié)尾*/

6. 分號

單行多個語句時用來分隔从绘,其它情況可省略寄疏。

let cat = "??"; print(cat)

7. 整數(shù)

分為有符號(正負數(shù)和0)和無符號(正數(shù)和0)整數(shù)
Swift提供了8,16僵井,32 和 64位編碼的有符號和無符號整數(shù)

  1. 有符號:Int8 Int16 Int32 Int64
  2. 無符號:UInt8 UInt16 UInt32 UInt64

整數(shù)范圍

通過 minmax 屬性來訪問每個整數(shù)類型的最小值和最大值:

let minValue = UInt8.min // 最小值是 0, 值的類型是 UInt8
let maxValue = UInt8.max // 最大值是 255, 值得類型是 UInt8

Int

32 位機器上是Int32, 64 位機器上是Int64.

UInt

32 位機器上是UInt32, 64 位機器上是UInt64.

8. 浮點數(shù)

  1. Double代表 64 位的浮點數(shù)陕截。
  2. Float 代表 32 位的浮點數(shù)

Double 有至少 15 位數(shù)字的精度,而 Float 的精度只有 6 位批什。

9. 類型安全和類型推斷

類型安全:編譯代碼的時候會進行類型檢查农曲,任何不匹配的類型都會被標記為錯誤。
類型推斷:未進行類型聲明驻债,自動推斷出合適的類型乳规。如:

let meaningOfLife = 42       // meaningOfLife 被推斷為 Int 類型
let pi = 3.14159             // pi 被推斷為 Double 類型
let anotherPi = 3 + 0.14159  // anotherPi 被推斷為 Double 類型

10. 數(shù)值型字面量

  1. 十進制數(shù),沒有前綴
  2. 二進制數(shù)合呐,前綴: 0b
  3. 八進制數(shù)暮的,前綴: 0o
  4. 十六進制數(shù),前綴: 0x
    示例分別為:
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation

整數(shù)和浮點數(shù)都可以添加額外的零或者添加下劃線來增加代碼的可讀性:

let paddedDouble = 000123.456
let oneMillion   = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1

11. 數(shù)值類型轉(zhuǎn)換

整數(shù)轉(zhuǎn)換

不同整數(shù)的類型在變量和常量中存儲的數(shù)字范圍是不同的淌实。Int8類型的常量或變量可以存儲的數(shù)字范圍是 -128 ~ 127冻辩,而 UInt8 類型的常量或者變量能存儲的數(shù)字范圍是 0~255 。如果數(shù)字超出了常量或者變量可存儲的范圍拆祈,編譯的時候就會報錯:

let cannotBeNegative: UInt8 = -1
// UInt8 類型不能存負數(shù)恨闪,編譯會報錯。
let tooBig: Int8 = Int8.max + 1
// Int8 類型個不能存大于其最大值的數(shù)字放坏,所以編譯也會報錯

不同類型的整型原則上無法直接相加咙咽,需要轉(zhuǎn)換為同一類型,如:

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)

整數(shù)和浮點數(shù)轉(zhuǎn)換

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 此時為 3.14159, 并未推斷為 Double 類型淤年。
let integerPi = Int(pi)
// integerPi 此時為 3, 并被推斷為 Int 類型钧敞。

注意:浮點數(shù)->整數(shù)類型時,數(shù)值會被截斷互亮。如: 4.75 會變成 4犁享,-3.9 會變?yōu)?-3。

12. 類型別名

給系統(tǒng)類型換個你覺得爽的名字:

typealias AudioSample = UInt16
// 此時 AudioSample 和 UInt16等價豹休,如用它初始化下面的變量 maxAmplitudeFound:
var maxAmplitudeFound = AudioSample.max

13. 布爾值(Bool)

Swift布爾值是兩個常量值炊昆,truefalse,聲明一個Bool值:

let orangesAreOrange = true
let turnipsAreDelicious = false

Bool常用語if語句,如:

if turnipsAreDelicious {
    print("Mmm, tasty turnips!")
} else {
    print("Eww, turnips are horrible.")
}

注意:非Bool值不可以作為if語句的判斷條件

14. 元組

圓括號組裝一堆類型凤巨,稱之為元組视乐。
元組內(nèi)的值可以是任何類型,而且可以不必是同一類型敢茁。如:

常量http404Error(Int, String)類型, 值是(404, "Not Found")

let http404Error = (404, "Not Found")

拆開這個元組:

let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// 打印結(jié)果: "The status code is 404"
print("The status message is \(statusMessage)")
// 打印結(jié)果: "The status message is Not Found"

如想忽略某些信息佑淀,變量名可以用下劃線“_”代替:

let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 打印結(jié)果: "The status code is 404"

換個姿勢拆這個元組, 索引:

print("The status code is \(http404Error.0)")
// 打印結(jié)果: "The status code is 404"
print("The status message is \(http404Error.1)")
// 打印結(jié)果: "The status message is Not Found"

或者一開始你就取好元組內(nèi)的成員名字:

let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
// 打印結(jié)果: "The status code is 200"
print("The status message is \(http200Status.description)")
// 打印結(jié)果: "The status message is OK"

15. 可選項

可選項,允許一個常量或變量值為nil彰檬。

nil

聲明一個可選變量伸刃,并置nil。

var serverResponseCode: Int? = 404
// serverResponseCode 有值逢倍,是404捧颅。
serverResponseCode = nil
// serverResponseCode 此時為nil

如果定義的可選變量沒有提供默認值,變量會被自動設(shè)置成nil较雕。

var surveyAnswer: String?
// surveyAnswer 被自動設(shè)置成 nil

注意:非可選變量或常量不可以置nil

If 語句以及強制展開

原理: 如果一個可選項有值碉哑,它就“不等于” nil,所以if語句派上用場:

if convertedNumber != nil {
    print("convertedNumber contains some integer value.")
}
// 打印結(jié)果: "convertedNumber contains some integer value."

一旦你確定可選項中包含值亮蒋,可以在可選項名字后以一個感嘆號強制展開扣典,如:

if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber!).")
}
// 打印結(jié)果: "convertedNumber has an integer value of 123."

注意:強制展開nil會導致運行錯誤,因此要確保其有值慎玖。

可選項綁定

上面的例子通常用下面的綁定寫法代替:

if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
    print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 打印結(jié)果: "'123' has an integer value of 123"

多個判斷條件用逗號分隔贮尖,下面兩個例子是等價的:

if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}
// 打印結(jié)果: "4 < 42 < 100"
 
if let firstNumber = Int("4") {
    if let secondNumber = Int("42") {
        if firstNumber < secondNumber && secondNumber < 100 {
            print("\(firstNumber) < \(secondNumber) < 100")
        }
    }
}
// 打印結(jié)果: "4 < 42 < 100"

注意:使用if語句創(chuàng)建的常量和變量只在if語句的函數(shù)體內(nèi)有效。但是凄吏,在guard語句中創(chuàng)建的常量和變量在guard語句后的代碼中仍然可用远舅。

嘆號展開可選項

有時在一些程序結(jié)構(gòu)中變量一旦被設(shè)定值之后闰蛔,就會一直擁有值痕钢,因此不必每次訪問的時候都進行判斷然后展開。這種一定能被訪問到值的變量序六,定義時可以采用如(String!)而非問號(String?) 來初始化任连。如:

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 直接訪問assumedString,不需要嘆號

普通的可選項必須用“變量或常量名 + 嘆號”的方式或者可選項綁定的方式訪問:

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // possibleString 后需要接一個嘆號

注意:若變量可能為nil例诀,則不建議使用嘆號展開可選項

16. 錯誤處理

使用錯誤處理機制來為錯誤狀況負責:

func canThrowAnError() throws {
    // 函數(shù)名括號后添加“throws”關(guān)鍵字随抠,表明此函數(shù)或許會拋出異常。
}

異常有拋出繁涂,相應(yīng)地拱她,就有捕獲(使用do{}...catch{}語句):

do {
    try canThrowAnError()
    // 使用“try”關(guān)鍵字 嘗試捕獲或許會拋出異常的函數(shù)
} catch {
    // 捕獲異常后,做后續(xù)處理
}

舉個栗子:

func makeASandwich() throws {
    // 此函數(shù)是指要做三明治扔罪,但有可能過程沒那么順利秉沼,拋出異常。
}
 
do {
    try makeASandwich()  // 嘗試做三明治
    eatASandwich()        // 做好了,沒異常唬复,直接吃掉矗积。
} catch Error.OutOfCleanDishes { // 異常情況: 盤子不干凈
    washDishes()                 // 洗盤子
} catch Error.MissingIngredients(let ingredients) { // 異常情況: 缺少佐料
    buyGroceries(ingredients)    // 去買佐料
}

注意:若異常條件都滿足,則都執(zhí)行相應(yīng)后續(xù)處理敞咧。更詳細使用方式棘捣,后續(xù)介紹。

17.斷言

想提前終止程序進行調(diào)試時休建,使用斷言乍恐。

使用斷言進行調(diào)試

使用全局函數(shù) assert(_:_:) 函數(shù)來寫斷言:

let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 此函數(shù)第一個參數(shù)為Bool,第二個參數(shù)(也可以省略)為String测砂。
// 如果Bool值為false禁熏,則程序終止,輸出第二個參數(shù)的String值邑彪。
// 因此瞧毙,如果年齡age為負數(shù),程序終止寄症,輸出后面字符串宙彪。

注意: Xcode以默認發(fā)布配置編譯到app時,斷言失效有巧。

什么時候常使用斷言

  1. 判定數(shù)組越界
  2. 判定合法值
  3. 判定可選項非空

斷言是作為調(diào)試的有效手段释漆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市篮迎,隨后出現(xiàn)的幾起案子男图,更是在濱河造成了極大的恐慌,老刑警劉巖甜橱,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逊笆,死亡現(xiàn)場離奇詭異,居然都是意外死亡岂傲,警方通過查閱死者的電腦和手機难裆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镊掖,“玉大人乃戈,你說我怎么就攤上這事∧督” “怎么了症虑?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長归薛。 經(jīng)常有香客問我谍憔,道長驶冒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任韵卤,我火速辦了婚禮骗污,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沈条。我一直安慰自己需忿,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布蜡歹。 她就那樣靜靜地躺著屋厘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪月而。 梳的紋絲不亂的頭發(fā)上汗洒,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音父款,去河邊找鬼溢谤。 笑死,一個胖子當著我的面吹牛憨攒,可吹牛的內(nèi)容都是我干的世杀。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼肝集,長吁一口氣:“原來是場噩夢啊……” “哼瞻坝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杏瞻,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤所刀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捞挥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浮创,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年树肃,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒸矛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瀑罗。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡胸嘴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斩祭,到底是詐尸還是另有隱情劣像,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布摧玫,位于F島的核電站耳奕,受9級特大地震影響绑青,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屋群,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一闸婴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芍躏,春花似錦邪乍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至否纬,卻和暖如春吕晌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背临燃。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工睛驳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膜廊。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓柏靶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溃论。 傳聞我的和親對象是個殘疾皇子屎蜓,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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

  • 關(guān)于 Swift 重要這個文檔所包含的準備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,320評論 1 27
  • Swift 是一門開發(fā) iOS, macOS, watchOS 和 tvOS 應(yīng)用的新語言钥勋。然而炬转,如果你有 C 或...
    XLsn0w閱讀 922評論 2 1
  • 常量和變量 常量和變量把一個名字(比如maximumNumberOfLoginAttempts或者welcomeM...
    窮人家的孩紙閱讀 2,421評論 0 3
  • 時間也許會消磨記憶,但它抹不去刻在靈魂深處的痕跡算灸。 八歲扼劈,停留在幼時的呼吸,像是在提醒著我菲驴,我也是平凡世界的一員荐吵。...
    未知生物N閱讀 185評論 1 2
  • 《班長大人》在國慶長假中完美收官,該劇自上線以來吸引了大批年輕觀眾特別是學生黨的密切關(guān)注并引發(fā)討論熱潮赊瞬,截止發(fā)稿時...
    玫瑰恩閱讀 365評論 0 0