Swift學(xué)習(xí)

Swift學(xué)習(xí)

基礎(chǔ)部分

  1. 變量聲明方式不同,使用let, var關(guān)鍵字铛嘱,類型推斷非常多,需要注意
  2. 基礎(chǔ)類型的使用墨吓,如Int, String, Float, Double, Boolean,注意數(shù)值類型的默認(rèn)類型帖烘,3.14默認(rèn)是Double類型
  3. 元組類型數(shù)據(jù)(tuples)
  4. 引入Optional類型,默認(rèn)為nil秘症,可對其有無值進(jìn)行判斷,同時引入可選類型綁定(Optional Binding) if let/var, 空合運(yùn)算符 ?? 語法糖乡摹,進(jìn)行nil判斷,可選類型解析 ?, ! 進(jìn)行解包
  5. 錯誤處理
  6. 決斷assert蹄葱,用于調(diào)試

基本運(yùn)算符

  1. 運(yùn)算符基本所有的語言都通用氏义,不過swift含有可選類型锄列,故引入了空合運(yùn)算符???, !對可選類型進(jìn)行拆包
  2. 區(qū)間運(yùn)算符 ..., ..< 語法糖惯悠,多用于循環(huán)和數(shù)組下標(biāo)

字符串和字符

  1. String 是值類型邻邮,使用Unicode編碼,而NSString使用UTF-16編碼
  2. 引入多行字符串開關(guān)引號克婶,前后都是三個引號"
  3. 字符串拼接使用+append
  4. 字符串插值筒严,在字符串中是\(value)value的值插入到字符串中
  5. 其中字符的使用,多使用字符串索引情萤,String.Index, 操作起來比較復(fù)雜鸭蛙,和java中操作字符串一樣,是比較少使用筋岛,但是需要時間學(xué)習(xí)的功能
  6. 字符串的比較
  7. 前后綴的使用

集合類型

數(shù)組 Array

聲明數(shù)組

var arr: Array<String> = Array<String>()
// or
var arr: [String] = [String]()

其中Array<String>[String]是數(shù)組的類型娶视,Array<String>()[String]()是變量的聲明,統(tǒng)一都是類型()的形式來聲明變量

數(shù)組的簡單使用

使用方法和java差不多,增刪改查肪获,只是函數(shù)名不同而已

數(shù)組的遍歷

使用foreach遍歷

for item in shoppingList {
    print(item)
}

同時需要索引

for (index, item) in shoppingList.enumerated() {
    print("Item \(item)'s index is \(index).")
}

集合 Sets

其中的類型需要保證是可哈希的

哈希值

swift基本類型都實(shí)現(xiàn)了Hashtable協(xié)議寝凌,如果自定義的類型需要實(shí)現(xiàn)HashtableEquatable類型

基本操作

除了不能使用下標(biāo)進(jìn)行訪問,其他操作基本和Array相同

集合間操作

運(yùn)算
  1. intersection 兩個集合相同的部分
  2. symmetricDifference 兩個集合不同的部分
  3. union 兩個集合合并
  4. subtracting 前者集合減去和后者集合相同的部分
比較
  1. isSubset 前者是否是后者的子集
  2. isSuperset 前者是否是后者的父集
  3. isStrictSubset 前者是否是后者的子集孝赫,并且兩者不等
  4. isStrictSuperset 前者是否是后者的父集较木,并且兩者不等
  5. isDisjoint 是否兩者沒有相同的元素

字典 Dictionary

聲明字典

var dic: Dictionary<Int, String> = Dictionary<Int, String>()
// or
var dic: [Int: String] = [Int: String]()

基本操作

字典的操作也是增刪改查,如函數(shù)updateValue, removeValue

字典遍歷

// 遍歷key和value
for (key, value) in dic {
    print("key is \(key), value is \(value)")
}

// 遍歷key
for key in dic.keys {
    print("key is \(key)")
}

// 遍歷value
for value in dic.values {
    print("value is \(value)")
}

控制流

for-in

  1. 主要用于集合的遍歷
  2. 用于循環(huán)求值

集合遍歷的使用方法在上一節(jié)集合類型中已經(jīng)涉及了青柄,這里主要說一下循環(huán)求值伐债,和類C語言中有些不一樣,其主要使用Range區(qū)間的概念

for index in 1...5 {
    print("\(index)")
}

int end = 10;
for index in 5...end {
    print("\(index)")
}

for minute in stride(from: 0, to: 60, by: 5) {
    print("\(minute)")  // 0,5,10...55  不包含to的值
}

for hour in stride(from: 3, through: 12, by: 3) {
    print("\(hour)")    // 3,6,9,12     包含through的值
}

while, repeat-while

使用方法和C中的while, do-while一樣

if

使用方法和C中的if一樣

switch

swift中的switch非常強(qiáng)大刹前,不僅可以匹配Int, String, 還可以匹配各種條件泳赋,可以認(rèn)為,swift想讓它來簡化多個if-else喇喉。

基本概念和用法

switch-case并不需要break中斷祖今,默認(rèn)是自動中斷的,如果需要多個case貫通拣技,那么需要使用fallthrough連接千诬,并且多個case并不能合并一起使用,而是將多個匹配放在同一個case中膏斤,使用逗號,隔開徐绑,或者多個case使用逗號,不是:隔開。

區(qū)間莫辨、元組

case匹配可以是一個區(qū)間,元組盘榨。

值綁定

if一樣草巡,case匹配也可以使用值綁定,不要看著官方文檔上比較復(fù)雜山憨,實(shí)際原理是一樣的

同時郁竟,引入了where關(guān)鍵字棚亩,對值綁定進(jìn)行匹配

控制轉(zhuǎn)換語句

  • continue: 和C中使用方式一樣
  • break: 和C中使用方式一樣
  • fallthrough: 因?yàn)?code>swift自動中斷case蔑舞,所以需要貫通時,使用fallthrough關(guān)鍵詞
  • label: 帶標(biāo)簽的語句从撼,極其少的使用低零,最好不要使用

guard

guard關(guān)鍵字時候swift引用的掏婶,和go中處理io關(guān)閉的思想是一樣的潭陪,在聲明時就寫好關(guān)閉操作依溯,避免遺忘,guard用于當(dāng)條件不滿足時提前退出枝秤,使用方法可以認(rèn)為時候if-else的簡化版慷嗜。

檢查版本

if #available(iOS 10, macOS 10.12, *) {
    // 使用iOS, mac10.12之后的API
} else {
    // 使用舊API
}

函數(shù)

定義

函數(shù)是完成一段特定任務(wù)的獨(dú)立代碼片段庆械。

swift中函數(shù)參數(shù)是在()內(nèi)干奢,和C, Java不同的是參數(shù)類型是在參數(shù)后以:隔開盏袄,返回類型在()后面,用->隔開逛尚,如果沒有返回值绰寞,可以省略-> Void,接著就是{}包括的函數(shù)體

分類

  • 無參數(shù)函數(shù)
  • 多參數(shù)函數(shù)
  • 無返回值函數(shù)
  • 多重返回值函數(shù)
  • 可選元組返回類型函數(shù)

記住觉壶,函數(shù)的參數(shù)可以是可選類型铜靶,返回值類型也可以是可選類型争剿,返回類型如果是元組痊末,那么整個元組也可以是可選類型

參數(shù)標(biāo)簽

swift中凿叠,一個參數(shù)可以有兩個名字,一個是在調(diào)用時使用的辆它,一個是在函數(shù)體內(nèi)部使用的锰茉,如果只聲明一個參數(shù)名切心,那么默認(rèn)內(nèi)外使用的參數(shù)名是一樣的绽昏。在聲明外部使用的參數(shù)名時,可以使用_代替肤晓,表示在調(diào)用時补憾,不聲明參數(shù)名盈匾。

故削饵,在swift中,_一律表示可以省略

默認(rèn)參數(shù)值

Java中經(jīng)常會碰見為了接受多個參數(shù)窿撬,而且某些參數(shù)如果不指定的情況下劈伴,給一個默認(rèn)值的情況,從而會定義多個同名不同參的方法苏遥,使用默認(rèn)參數(shù)值就是為了避免定義多個函數(shù)田炭。

在聲明參數(shù)時漓柑,可以為函數(shù)指定默認(rèn)值,在調(diào)用函數(shù)時瞬矩,可以不傳該參數(shù)景用,表示使用默認(rèn)參數(shù)值惭蹂。如下

func defaultParamFunc(value: Int, defaultValue: Int = 5) {
    // do something
}
defaultParamFunc(value: 10)
defaultParamFunc(value: 10, defaultValue: 15)

可變參數(shù)

C中使用相同

輸入輸出函數(shù)

可以認(rèn)為是將參數(shù)的指針傳遞進(jìn)去盾碗,調(diào)用輸入輸出函數(shù)時廷雅,使用&修飾參數(shù)。如下

// 聲明時商架,參數(shù)類型使用inout修飾
func swapTwoInteger(_ a: inout Int, _ b: inout Int) {
    let tmp = a
    a = b;
    b = tmp
}

var a = 10
var b = 5
// 調(diào)用時甸私,使用&修飾參數(shù)值
swapTwoInteger(&a, &b)
print("a = \(a), b = \(b)")
// a = 5, b = 10

函數(shù)類型

函數(shù)本身具有類型飞傀,如() -> Void是一個無參數(shù)弃鸦,無返回值(返回值為Void)的函數(shù)唬格。那么可以這樣認(rèn)為颜说,一個常量或者變量门粪,有名字和類型玄妈,而函數(shù)拟蜻,也有名字和類型,這個默認(rèn)的名字诡必,就是聲明函數(shù)時的名字擒权。

這樣函數(shù)就是一種類型碳抄,函數(shù)名就是變量名/常量名场绿,將函數(shù)作為函數(shù)的參數(shù),或者返回類型璧尸,就不會變得那么別扭了。

嵌套函數(shù)

即閉包爷光,默認(rèn)的域包括外部函數(shù)的臨時變量和外部函數(shù)可以使用的變量

閉包

前言

閉包的語法比較多蛀序,會簡單的使用徐裸,在使用中逐步深入即可。

定義

閉包是自包含的函數(shù)代碼塊骑祟,可以在代碼中被傳遞和使用次企。

形式

在函數(shù)章節(jié)中介紹的全局和嵌套函數(shù)實(shí)際上也是特殊的閉包潜圃,閉包采用如下三種形式之一:

  • 全局函數(shù)是一個有名字但不會捕獲任何值的閉包
  • 嵌套函數(shù)是一個有名字并可以捕獲其封閉函數(shù)域內(nèi)值的閉包
  • 閉包表達(dá)式是一個利用輕量級語法所寫的可以捕獲其上下文中變量或常量值的匿名閉包

閉包表達(dá)式

閉包表達(dá)式的一般形式:使用in分割

{ (parameter) -> return type in
    statement
}

// 如下
let sortedNames = names.sorted(by: {(s1: String, s2: String) -> Boolean in
    return s1 > s2
})

// 參數(shù)類型推斷抒巢,省略參數(shù)類型
let sortedNames = names.sorted(by: {(s1, s2) -> Boolean in
    return s1 > s2
})

// 返回類型退款,省略返回類型
let sortedNames = names.sorted(by: { s1, s2 in
    return s1 > s2
})

// 單表達(dá)式省略`return`
let sortedNames = names.sorted(by: {s1, s2 in s1 > s2})

// 參數(shù)名稱縮寫
let sortedNames = names.sorted(by: {$0 > $1})

// 運(yùn)算符方法
let sortedNames = names.sorted(by: >)

尾隨閉包

// 省略參數(shù)標(biāo)簽秉犹,省略`()`
let sortedNames = names.sorted {s1, s2 in s1 > s2}

值捕獲

閉包可以在其被定義的上下文中捕獲常量或變量蛉谜。即使定義這些常量和變量的原作用域已經(jīng)不存在,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值崇堵。

閉包是引用類型

逃逸閉包

自動閉包

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末型诚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸳劳,更是在濱河造成了極大的恐慌狰贯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涵紊,死亡現(xiàn)場離奇詭異既忆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酪术,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門衰齐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘟檩,“玉大人趴俘,你說我怎么就攤上這事太惠。” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谐檀。 經(jīng)常有香客問我刽肠,道長羔沙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任蝴蜓,我火速辦了婚禮诵冒,結(jié)果婚禮上午笛,老公的妹妹穿的比我還像新娘癌佩。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布押赊。 她就那樣靜靜地躺著包斑,像睡著了一般丸卷。 火紅的嫁衣襯著肌膚如雪凹联。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天嫩海,我揣著相機(jī)與錄音,去河邊找鬼耳璧。 笑死蹬昌,一個胖子當(dāng)著我的面吹牛皂贩,可吹牛的內(nèi)容都是我干的辈末。 我是一名探鬼主播组去,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炉擅!你這毒婦竟也來了阳惹?” 一聲冷哼從身側(cè)響起谍失,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎莹汤,沒想到半個月后快鱼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纲岭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年抹竹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止潮。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡窃判,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喇闸,到底是詐尸還是另有隱情袄琳,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布仅偎,位于F島的核電站跨蟹,受9級特大地震影響雳殊,放射性物質(zhì)發(fā)生泄漏橘沥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一夯秃、第九天 我趴在偏房一處隱蔽的房頂上張望座咆。 院中可真熱鬧,春花似錦仓洼、人聲如沸介陶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哺呜。三九已至,卻和暖如春箕戳,著一層夾襖步出監(jiān)牢的瞬間某残,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工陵吸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玻墅,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓壮虫,卻偏偏與公主長得像澳厢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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