1.基礎(chǔ)內(nèi)容 The Basics Swift官方文檔——版納的筆記


//: Playground - noun: a place where people can play



import UIKit

// # 常量和變量

// 在一行中聲明多個變量或常量廓俭,用逗號分隔

var x = 0, y = 0.0, z = "dfd"

// 類型標(biāo)注

var welcomeMessage: String

welcomeMessage = "Hello"

// trick: 多個同類型變量

var red, green, blue: Double

// 輸出全局函數(shù): print(<#T##items: Any...##Any#>, separator: <#T##String#>(默認(rèn)值是空格), terminator: <#T##String#>(默認(rèn)值是換行))

// # 注釋

// # 分號

// # 整數(shù)

// 用.min, .max訪問類型的最小最大值邪驮,這是一個static的只讀變量

print(UInt8.min)

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

// # 類型安全和類型推斷

// 字面量3和7都被推斷為Double舌狗,如果不是字面量會報錯柳畔。換言之,字面量 3 可以直接和字面量 0.14159 相加,因?yàn)閿?shù)字字面量本身沒有明確的類型救欧。它們的類型只有在編譯器需要計算的時候才會被推測出來定庵。

var result = (3 + 2.1) / 7

// # 數(shù)值型字面量

// 1.25e2意味著125.0吏饿,1.25e-2意味著0.0125

// trick: 整數(shù)和浮點(diǎn)數(shù)都可以添加額外的零或者添加下劃線來增加代碼的可讀性。下面的這些格式都不會影響字面量的值蔬浙。

let paddedDouble = 000123.456

let oneMillion = 1_000_000

let justOverOneMillion = 1_000_000.000_000_1

// # 數(shù)值類型轉(zhuǎn)換

// 拓展Int使其支持類型轉(zhuǎn)換猪落。要注意Int中self的用法。

class Binary {

    var first = 0

    var secend = 0

}

extension Int {

    init(_ binary: Binary) {

        self = binary.first * 2 + binary.secend

    }

}

var binary = Binary()

print(Int(binary))

// 在用浮點(diǎn)數(shù)初始化一個新的整數(shù)類型的時候敛滋,數(shù)值會被截斷许布。也就是說 4.75 會變成 4 , -3.9 會變?yōu)?-3 绎晃。

// # 類型別名

typealias Student = Int

let tom = Student(8)

let jerry = Int(3)

// # 布爾值

// # 元組

// 是值類型

// 元組可以合起來使用

let coupleOne = ("James", "Marry")

print(coupleOne)

print(coupleOne.0)

// 也可以分開使用蜜唾,又叫拆分,是單獨(dú)提取元組元素時用

let (husband, wife) = ("Bob", "Lily")

print("The husband is \(husband)")

// trick: 拆分過程中不需要的用_代替

let (anotherHusband, _) = ("Kevin", "Sophia")

print(anotherHusband)

// 調(diào)整內(nèi)部名庶艾,也可以就用默認(rèn).0, .1等訪問袁余。注意這并非是拆分了元組,不能直接用新名字。另外可以看到咱揍,coupleFour的類型為(fourthHusband: String, fourthWife: String)而不是(String, String),有本質(zhì)區(qū)別

let coupleFour = (fourthHusband: "King", fourthWife: "Darling")

print(coupleFour.1)

print(coupleFour.fourthHusband)

// # 可選項(xiàng)

// trick: String轉(zhuǎn)換為Int的初始化器颖榜,返回一個Int?

let possibleNumber = "123"

let convertedNumber = Int(possibleNumber)

var sir: String? // var類型可選被自動設(shè)值為nil

let shemale: String? // let類型可選不會被隱式初始化為nil

shemale = "Jack" // 此時被初始化,此后不能再改變其值

var lady: String? = "Sophia"

// 在類型中,也可以得到體現(xiàn)

class Dog {

    var name: String? // 若為let掩完,會報錯并提示init未對其初始化

    var color: String

    init(ofColor color: String) {

        self.color = color

    }

}

// 用if判斷然后強(qiáng)制展開噪漾,好處是不用多令一個常量并且保證安全

if convertedNumber != nil {

    print("convertedNumber contains some intrgar value and it's \(convertedNumber!)")

}

// 可選項(xiàng)綁定,可用于if和while語句且蓬,好處是可以多一個變量來使用可選包含的量并且安全欣硼。注意,控制流里定義的變量在之后消失 while let???

if let actualNumber = Int(possibleNumber) {

    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")

} else {

    print("\'\(possibleNumber)\' could not be converted to an integer")

}

// trick: 在同一個if語句中包含多個可選項(xiàng)綁定和布爾運(yùn)算恶阴,用逗號隔開诈胜,相當(dāng)于“與”運(yùn)算。

if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber, secondNumber < 100 {

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

}

// 隱式展開可選項(xiàng):既不用寫所在類的初始化器冯事,又不用麻煩地每次強(qiáng)制展開焦匈。也可以用if判斷或者用可選項(xiàng)綁定

var assumedString: String!

assumedString = "OK"

assumedString = nil

// trick: 不要在一個變量將來會變?yōu)?nil 的情況下使用隱式展開可選項(xiàng)。這樣有些危險昵仅,不如用普通可選項(xiàng)了缓熟。

// ??:合并空值運(yùn)算符

var flag: Bool?

var shitIsGood = flag ?? false

print(shitIsGood)

// # 錯誤處理

// 函數(shù)聲明過程加上throws關(guān)鍵字

func makeASandwich() throws {



}

// 調(diào)用函數(shù)時,在表達(dá)式前置try關(guān)鍵字岩饼。do語句創(chuàng)建容器范圍荚虚,可讓錯誤傳遞到catch分句

/*

do {

    try makeASandwich()

    // 如果沒有錯誤,則調(diào)用

    eatASandwich()

} catch Error.OutOfCleanDishes {

    washDishes()

} catch Error.MissingIngredients(let ingredients) {

    buyGroceries(ingredients)

}

*/

// # 斷言和先決條件

// 斷言:一個從宏觀角度檢查程序的全局函數(shù)籍茧,并且只在調(diào)試階段觸發(fā)

let age = 3

assert(age >= 0, "A person's age cannot be less than zero")

// 直接斷言

if age >= 0 {

    print("You are human now")

} else {

    assertionFailure("A person's age cannot be less than zero")

}

// 先決條件版述,差不多,具體差異???

precondition(age >= 0, "A person's age cannot be less than zero")

// fatalError(_:file:line:)也差不多寞冯,只是不用執(zhí)行檢查罷了

//: Playground - noun: a place where people can play

import UIKit

// # 常量和變量

// 在一行中聲明多個變量或常量渴析,用逗號分隔

var x = 0, y = 0.0, z = "dfd"

// 類型標(biāo)注

var welcomeMessage: String

welcomeMessage = "Hello"

// trick: 多個同類型變量

var red, green, blue: Double

// 輸出全局函數(shù): print(<#T##items: Any...##Any#>, separator: <#T##String#>(默認(rèn)值是空格), terminator: <#T##String#>(默認(rèn)值是換行))

// # 注釋

// # 分號

// # 整數(shù)

// 用.min, .max訪問類型的最小最大值,這是一個static的只讀變量

print(UInt8.min)

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

// # 類型安全和類型推斷

// 字面量3和7都被推斷為Double吮龄,如果不是字面量會報錯俭茧。換言之,字面量 3 可以直接和字面量 0.14159 相加漓帚,因?yàn)閿?shù)字字面量本身沒有明確的類型母债。它們的類型只有在編譯器需要計算的時候才會被推測出來。

var result = (3 + 2.1) / 7

// # 數(shù)值型字面量

// 1.25e2意味著125.0尝抖,1.25e-2意味著0.0125

// trick: 整數(shù)和浮點(diǎn)數(shù)都可以添加額外的零或者添加下劃線來增加代碼的可讀性毡们。下面的這些格式都不會影響字面量的值。

let paddedDouble = 000123.456

let oneMillion = 1_000_000

let justOverOneMillion = 1_000_000.000_000_1

// # 數(shù)值類型轉(zhuǎn)換

// 拓展Int使其支持類型轉(zhuǎn)換昧辽。要注意Int中self的用法衙熔。

class Binary {

    var first = 0

    var secend = 0

}

extension Int {

    init(_ binary: Binary) {

        self = binary.first * 2 + binary.secend

    }

}

var binary = Binary()

print(Int(binary))

// 在用浮點(diǎn)數(shù)初始化一個新的整數(shù)類型的時候,數(shù)值會被截斷搅荞。也就是說 4.75 會變成 4 红氯, -3.9 會變?yōu)?-3 框咙。

// # 類型別名

typealias Student = Int

let tom = Student(8)

let jerry = Int(3)

// # 布爾值

// # 元組

// 是值類型

// 元組可以合起來使用

let coupleOne = ("James", "Marry")

print(coupleOne)

print(coupleOne.0)

// 也可以分開使用,又叫拆分痢甘,是單獨(dú)提取元組元素時用

let (husband, wife) = ("Bob", "Lily")

print("The husband is \(husband)")

// trick: 拆分過程中不需要的用_代替

let (anotherHusband, _) = ("Kevin", "Sophia")

print(anotherHusband)

// 調(diào)整內(nèi)部名喇嘱,也可以就用默認(rèn).0, .1等訪問。注意這并非是拆分了元組,不能直接用新名字塞栅。另外可以看到婉称,coupleFour的類型為(fourthHusband: String, fourthWife: String)而不是(String, String),有本質(zhì)區(qū)別

let coupleFour = (fourthHusband: "King", fourthWife: "Darling")

print(coupleFour.1)

print(coupleFour.fourthHusband)

// # 可選項(xiàng)

// trick: String轉(zhuǎn)換為Int的初始化器,返回一個Int?

let possibleNumber = "123"

let convertedNumber = Int(possibleNumber)

var sir: String? // var類型可選被自動設(shè)值為nil

let shemale: String? // let類型可選不會被隱式初始化為nil

shemale = "Jack" // 此時被初始化构蹬,此后不能再改變其值

var lady: String? = "Sophia"

// 在類型中,也可以得到體現(xiàn)

class Dog {

    var name: String? // 若為let悔据,會報錯并提示init未對其初始化

    var color: String

    init(ofColor color: String) {

        self.color = color

    }

}

// 用if判斷然后強(qiáng)制展開庄敛,好處是不用多令一個常量并且保證安全

if convertedNumber != nil {

    print("convertedNumber contains some intrgar value and it's \(convertedNumber!)")

}

// 可選項(xiàng)綁定,可用于if和while語句科汗,好處是可以多一個變量來使用可選包含的量并且安全藻烤。注意,控制流里定義的變量在之后消失 while let???

if let actualNumber = Int(possibleNumber) {

    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")

} else {

    print("\'\(possibleNumber)\' could not be converted to an integer")

}

// trick: 在同一個if語句中包含多個可選項(xiàng)綁定和布爾運(yùn)算头滔,用逗號隔開怖亭,相當(dāng)于“與”運(yùn)算。

if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber, secondNumber < 100 {

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

}

// 隱式展開可選項(xiàng):既不用寫所在類的初始化器坤检,又不用麻煩地每次強(qiáng)制展開兴猩。也可以用if判斷或者用可選項(xiàng)綁定

var assumedString: String!

assumedString = "OK"

assumedString = nil

// trick: 不要在一個變量將來會變?yōu)?nil 的情況下使用隱式展開可選項(xiàng)。這樣有些危險早歇,不如用普通可選項(xiàng)了倾芝。

// ??:合并空值運(yùn)算符

var flag: Bool?

var shitIsGood = flag ?? false

print(shitIsGood)

// # 錯誤處理

// 函數(shù)聲明過程加上throws關(guān)鍵字

func makeASandwich() throws {



}

// 調(diào)用函數(shù)時,在表達(dá)式前置try關(guān)鍵字箭跳。do語句創(chuàng)建容器范圍晨另,可讓錯誤傳遞到catch分句

/*

do {

    try makeASandwich()

    // 如果沒有錯誤,則調(diào)用

    eatASandwich()

} catch Error.OutOfCleanDishes {

    washDishes()

} catch Error.MissingIngredients(let ingredients) {

    buyGroceries(ingredients)

}

*/

// # 斷言和先決條件

// 斷言:一個從宏觀角度檢查程序的全局函數(shù)谱姓,并且只在調(diào)試階段觸發(fā)

let age = 3

assert(age >= 0, "A person's age cannot be less than zero")

// 直接斷言

if age >= 0 {

    print("You are human now")

} else {

    assertionFailure("A person's age cannot be less than zero")

}

// 先決條件借尿,差不多,具體差異???

precondition(age >= 0, "A person's age cannot be less than zero")

// fatalError(_:file:line:)也差不多屉来,只是不用執(zhí)行檢查罷了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末路翻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奶躯,更是在濱河造成了極大的恐慌帚桩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘹黔,死亡現(xiàn)場離奇詭異账嚎,居然都是意外死亡莫瞬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門郭蕉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疼邀,“玉大人,你說我怎么就攤上這事召锈∨哉瘢” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵涨岁,是天一觀的道長拐袜。 經(jīng)常有香客問我,道長梢薪,這世上最難降的妖魔是什么蹬铺? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮秉撇,結(jié)果婚禮上甜攀,老公的妹妹穿的比我還像新娘。我一直安慰自己琐馆,他們只是感情好规阀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘦麸,像睡著了一般谁撼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞎暑,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天彤敛,我揣著相機(jī)與錄音,去河邊找鬼了赌。 笑死墨榄,一個胖子當(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
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟹肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年词疼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帘腹。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贰盗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阳欲,到底是詐尸還是另有隱情舵盈,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布球化,位于F島的核電站秽晚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筒愚。R本人自食惡果不足惜爆惧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锨能。 院中可真熱鬧,春花似錦芍耘、人聲如沸址遇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倔约。三九已至,卻和暖如春坝初,著一層夾襖步出監(jiān)牢的瞬間浸剩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工鳄袍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绢要,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓拗小,卻偏偏與公主長得像重罪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哀九,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353