Swift學(xué)習(xí)
基礎(chǔ)部分
- 變量聲明方式不同,使用
let
,var
關(guān)鍵字铛嘱,類型推斷非常多,需要注意 - 基礎(chǔ)類型的使用墨吓,如
Int
,String
,Float
,Double
,Boolean
,注意數(shù)值類型的默認(rèn)類型帖烘,3.14
默認(rèn)是Double
類型 - 元組類型數(shù)據(jù)(tuples)
- 引入
Optional
類型,默認(rèn)為nil
秘症,可對其有無值進(jìn)行判斷,同時引入可選類型綁定(Optional Binding
)if
let
/var
, 空合運(yùn)算符??
語法糖乡摹,進(jìn)行nil
判斷,可選類型解析?
,!
進(jìn)行解包 - 錯誤處理
- 決斷assert蹄葱,用于調(diào)試
基本運(yùn)算符
- 運(yùn)算符基本所有的語言都通用氏义,不過
swift
含有可選類型锄列,故引入了空合運(yùn)算符??
,?
,!
對可選類型進(jìn)行拆包 - 區(qū)間運(yùn)算符 ..., ..< 語法糖惯悠,多用于循環(huán)和數(shù)組下標(biāo)
字符串和字符
- String 是值類型邻邮,使用Unicode編碼,而NSString使用UTF-16編碼
- 引入多行字符串開關(guān)引號克婶,前后都是三個引號
"
- 字符串拼接使用
+
或append
- 字符串插值筒严,在字符串中是
\(value)
將value
的值插入到字符串中 - 其中字符的使用,多使用字符串索引情萤,
String.Index
, 操作起來比較復(fù)雜鸭蛙,和java
中操作字符串一樣,是比較少使用筋岛,但是需要時間學(xué)習(xí)的功能 - 字符串的比較
- 前后綴的使用
集合類型
數(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)Hashtable
和Equatable
類型
基本操作
除了不能使用下標(biāo)進(jìn)行訪問,其他操作基本和Array
相同
集合間操作
運(yùn)算
-
intersection
兩個集合相同的部分 -
symmetricDifference
兩個集合不同的部分 -
union
兩個集合合并 -
subtracting
前者集合減去和后者集合相同的部分
比較
-
isSubset
前者是否是后者的子集 -
isSuperset
前者是否是后者的父集 -
isStrictSubset
前者是否是后者的子集孝赫,并且兩者不等 -
isStrictSuperset
前者是否是后者的父集较木,并且兩者不等 -
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
- 主要用于集合的遍歷
- 用于循環(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)引用和修改這些值崇堵。