我的博客地址: fengqiangboy.com
文檔更新說(shuō)明:
? 2016年10月07日 v1.0 初稿
0聚唐、前言
隨著iOS10的發(fā)布丐重,相信大部分公司都會(huì)把a(bǔ)pp的適配最低版本直接拉倒iOS8,畢竟維護(hù)和開(kāi)發(fā)成本都會(huì)省掉不少拱层。
在iOS8上面弥臼,有一個(gè)重要的特性,就是可以使用swift了根灯,而swift也已經(jīng)發(fā)布了3.0版本径缅,已經(jīng)相當(dāng)穩(wěn)定了,所以烙肺,這個(gè)時(shí)候開(kāi)始使用swift是一個(gè)明智的選擇纳猪。
這篇文章適合于有一定iOS開(kāi)發(fā)經(jīng)驗(yàn)的看。
1桃笙、常量
- 常量是不需要被改變的氏堤,用let關(guān)鍵字聲明
- 后面跟著常量的名稱,冒號(hào)后面表示產(chǎn)量的類型搏明,等號(hào)后面表示常量的值鼠锈。
- 在實(shí)際應(yīng)用當(dāng)中,一般省略冒號(hào)后面的類型聲明星著,swift會(huì)自動(dòng)根據(jù)我們的賦值來(lái)推斷該常量的類型购笆。
let language: String = "Swift"
let introduced: Int = 2014
let isAwesome: Bool = true
2、變量
- 可以被修改的值虚循,我們稱為變量
- 在swift中同欠,變量使用var聲明,格式和常量的聲明一致横缔。
let language = "Swift"
let introduced = 2014
let isAwesome = true
var version = 1
version = 3
isAwesome = false //這行報(bào)錯(cuò)
運(yùn)行上面的代碼铺遂,可以發(fā)現(xiàn),編譯器在最后一行報(bào)了錯(cuò)誤茎刚,因?yàn)槲覀冊(cè)噲D修改了一個(gè)常量的值襟锐。
3、字符串拼接
- swift中直接使用“+”來(lái)拼接字符串即可
let conference = "WWDC"
let message = "Hello, " + conference + "!"
// "Hello, WWDC!"
4膛锭、字符串插值
- 字符串的拼接不僅僅局限于字符串之間粮坞,swift也可以直接把值插入字符串中笛质。
- 把值連接到字符串中,只需要把值放入
\()
中捞蚂, - 括號(hào)內(nèi)還可以是一個(gè)表達(dá)式。例如:
\(year + 1)
let conference = "WWDC"
let message = "Hello, \(conference)!"
// "Hello, WWDC!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year)!"
// "Hello, WWDC 2016!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year + 1)!"
// "Hello, WWDC 2017!"
5跷究、集合:數(shù)組和字典
- swift中姓迅,數(shù)組和字典的聲明方式很相似,
- 為了安全俊马,我們可以在名字后面聲明類型丁存。
let names: [String] = ["Lily", "Santiago", "Justyn", "Aadya"]
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
- 當(dāng)然,swift也可以自動(dòng)推測(cè)數(shù)組和字典的類型柴我,因此解寝,在實(shí)際應(yīng)用中,可以省略類型
let names = ["Lily", "Santiago", "Justyn", "Aadya"]
// an array of String values
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// a dictionary with String keys and Int values
6艘儒、循環(huán)
6.1 While 和 Repeat-While 循環(huán)
- while循環(huán)聋伦,先檢查條件是否成立,再執(zhí)行循環(huán)體
- repeat循環(huán)界睁,先執(zhí)行循環(huán)體觉增,再判斷條件是否成立
while !endOfFile {
readLine()
}
repeat {
performTask()
} while tasksRemaining > 0
6.2 For-In循環(huán)
6.2.1 遍歷字符串
let dogString = "Dog?!??"
for character in dogString.characters {
print(character)
}
/*
輸出結(jié)果:
D
o
g
?
!
??
*/
6.2.2 遍歷一個(gè)閉合區(qū)間
使用1...5
表示[1,5]的閉合區(qū)間
for number in 1...5 {
print("\(number) times 4 is \(number * 4)")
}
/*
輸出結(jié)果:
1 times 4 is 4
2 times 4 is 8
3 times 4 is 12
4 times 4 is 16
5 times 4 is 20
*/
6.2.3 遍歷半開(kāi)半閉合區(qū)間
- 使用
1..<5
表示[1,5)的半開(kāi)半閉區(qū)間 - 沒(méi)有這樣的寫(xiě)法
1<..5
let results = [7, 52, 9, 33, 6, 12, 86, 4, 22, 18, 3]
let maxResultCount = 5
for index in 0..<maxResultCount {
print("Result \(index) is \(results[index])")
}
/*
輸出結(jié)果:
Result 0 is 7
Result 1 is 52
Result 2 is 9
Result 3 is 33
Result 4 is 6
*/
6.2.4 遍歷數(shù)組
- 遍歷的臨時(shí)變量不需要用let聲明,默認(rèn)以let聲明翻斟,如果需要逾礁,可以直接換成var聲明,如:
for var name in [...]
- 如果遍歷的臨時(shí)變量不需要被使用到访惜,可以用“
_
”來(lái)代替
for name in ["Lily", "Santiago", "Justyn", "Aadya"] {
print("Hello, \(name)!")
}
/*
輸出結(jié)果:
Hello, Lily!
Hello, Santiago!
Hello, Justyn!
Hello, Aadya!
*/
6.2.5 遍歷字典
- 使用元組
(key, value)
來(lái)表示字典的鍵和值 - 元組是可以綁定多個(gè)值的一個(gè)類型嘹履,用括號(hào)表示,值之間用逗號(hào)分割開(kāi)來(lái)
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
for (name, age) in ages {
print("\(name) is \(age) years old")
}
/*
輸出結(jié)果:
Mohsen is 17 years old
Amy is 40 years old
Graham is 5 years old
*/
7债热、可變集合
7.1砾嫉、可變數(shù)組
使用var聲明的數(shù)組就是可變數(shù)組,可以通過(guò)幾種方式修改可變數(shù)組中的值阳柔。
- 使用
.append
方法焰枢,給數(shù)組添加一個(gè)元素 - 使用下標(biāo)
packingList[2]
的方式,修改數(shù)組指定位置的元素(小心越界) - 使用
.append(contentsOf:[])
給數(shù)組增加一系列的值 - 使用下標(biāo)
packingList[3...5]
修改數(shù)組指定位置范圍的值舌剂,使用這個(gè)方法的時(shí)候济锄,如果等號(hào)右邊的元素?cái)?shù)量大于左邊的范圍,會(huì)擴(kuò)充原數(shù)組的長(zhǎng)度霍转,反之會(huì)減少
var packingList = ["Socks", "Shoes"]
print(packingList[0])
packingList.append("Trousers")
packingList[2] = "Jeans"
packingList.append(contentsOf: ["Shorts", "Sandals", "Sunblock"])
packingList[3...5] = ["Hoodie", "Scarf"]
/*
輸出結(jié)果:
["Socks", "Shoes", "Jeans", "Hoodie", "Scarf"]
*/
7.2荐绝、可變字典
- 可變字典的修改和增加方式都可以用下標(biāo)來(lái)直接操作
var ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
ages["Justyn"] = 67 // Adds a new value for "Justyn"
ages["Justyn"] = 68 // Changes the value for "Justyn"
/*
輸出結(jié)果:
["Mohsen": 17, "Amy": 40, "Graham": 5, "Justyn": 68]
*/
8、Optional
8.1避消、從字典中檢索值
- 從字典中檢索值需要考慮一個(gè)問(wèn)題低滩,就是字典中可能并沒(méi)有存儲(chǔ)我們需要檢索的值召夹,比如,在下面的字典中恕沫,我們?nèi)绻カ@取Devon监憎、Daryl、Daniel的值婶溯,這時(shí)候會(huì)獲得一個(gè)空值
nil
- 在獲取之后鲸阔,我們需要判斷一下值是否為
nil
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// Devon?
// Daryl?
// Daniel?
8.2、加上nil判斷
- 對(duì)于可能返回
nil
的值迄委,我們可以使用swift的Optional特性褐筛,在類型后面加一個(gè)?
,比如:Int?
叙身,這就表示這個(gè)值可能為nil
- 從字典獲取指定的值渔扎,加上判斷之后就變成了下面的代碼
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
let possibleAge: Int? = ages["Daryl"]
if possibleAge == nil {
print("Age not found.")
}
/*
輸出結(jié)果:
Age not found.
*/
8.3、nil值判斷優(yōu)化 If-Let
- 上面的判斷看起來(lái)沒(méi)問(wèn)題信轿,但是在實(shí)際應(yīng)用中晃痴,我們可能只關(guān)心值不為
nil
的情況,所以财忽,上面的寫(xiě)法會(huì)有些臃腫 - swift中提供了
If-Let
語(yǔ)句愧旦,只有在值不為nil
的時(shí)候才執(zhí)行條件體
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
if let age = ages["Amy"] {
print("An age of \(age) was found.")
}
/*
輸出結(jié)果:
An age of 40 was found.
*/
9、 判斷結(jié)構(gòu)
9.1定罢、if判斷結(jié)構(gòu)
- 和其它語(yǔ)言相似笤虫,只是swift中,條件語(yǔ)句不需要小括號(hào)括號(hào)括起來(lái)祖凫。
- 每個(gè)條件的執(zhí)行語(yǔ)句需要用大括號(hào)括起來(lái)
let age = 32
if age == 1 {
print("Happy first birthday!")
} else if age == 40 {
print("Happy 40th birthday!")
} else {
print("Happy plain old boring birthday.")
}
9.2琼蚯、Switch 判斷結(jié)構(gòu)
-
case
可以直接匹配一個(gè)精確的值,包括字符串變量也可以直接匹配 -
case
也可以匹配一個(gè)范圍惠况。如:case 13...19:
-
case
中還可以加入更精確的條件匹配語(yǔ)句遭庶。如:case let decade where decade % 10 == 0:
- 每個(gè)
case
語(yǔ)句不需要break來(lái)結(jié)束循環(huán),會(huì)自動(dòng)結(jié)束稠屠,如果需要執(zhí)行下一個(gè)case
的語(yǔ)句峦睡,需要加上fallthrough
關(guān)鍵字 -
switch
中需要匹配完整所有的情況,否則會(huì)報(bào)錯(cuò)
let age = 32
switch age {
case 1:
print("Happy first birthday!")
case 13...19:
print("Happy birthday, teenager!")
case let decade where decade % 10 == 0:
print("Happy significant \(decade)th birthday!")
default:
print("Happy plain old boring birthday.")
}
- switch可以直接匹配元組权埠,以達(dá)到匹配同時(shí)判斷多個(gè)值的目的榨了,如下:
- “
_
” 表示該位置匹配任何值
let userName = "admin"
let passwordIsValid = true
switch (userName, passwordIsValid) {
case ("admin", true):
print("Welcome back, administrator!")
case ("guest", _):
print("Guests are not allowed in this restricted area.")
case (_, let isValid):
print(isValid ? "Welcome to the restricted area!" : "ACCESS DENIED.")
}
/*
輸出結(jié)果:
Welcome back, administrator!
*/