swift學(xué)習(xí)總結(jié)
語言基礎(chǔ)
程序:指令的集合寫。寫程序就是寫一系列的指令去實(shí)現(xiàn)我們想做的事情
編譯:將程序語言轉(zhuǎn)換成計(jì)算機(jī)能夠理解的機(jī)器語言或者中間代碼的過程
馮洛伊曼體系結(jié)構(gòu)計(jì)算機(jī):
1.使用二進(jìn)制
2.程序存儲執(zhí)行
變量和常量
定義變量和常量是為了保存數(shù)據(jù)虑润。變量和常量就是某種類型值得存儲空間弥臼。
var a:Int = 10
a=100
var b:10
b=100
var c=1000
let d:Int = 10 //常量只能一次賦值
//d=100 //compiler error
let e=100
說明:swift有強(qiáng)大的類型推斷,所以定義變量或者常量時(shí)盡量用類型推斷而不用手動指定類型朝群,如果可以的話應(yīng)該盡量使用常量而不是變量
語言元素
var a:Int = 10
關(guān)鍵字:有特殊含義的單詞
標(biāo)識符:給變量燕耿,常量,函數(shù)姜胖,類誉帅,結(jié)構(gòu),協(xié)議右莱,方法蚜锨,屬性,等起名字
標(biāo)識符命名規(guī)則:
1.字母數(shù)字下劃線組成慢蜓,數(shù)字不能開頭
2.大小寫敏感
3.不能使用關(guān)鍵字做標(biāo)識符
4.使用駝峰命名法(命名變量常量函數(shù)方法屬性第一個(gè)單詞小寫亚再,從第二個(gè)單詞開始每個(gè)單詞首字母大寫;命名類晨抡,結(jié)構(gòu)氛悬,協(xié)議则剃,枚舉每個(gè)單詞首字母都要大寫)
5.見名知意
6.命名私有的屬性和方法時(shí)以下劃線開頭
運(yùn)算符:swift中的運(yùn)算符其實(shí)都是函數(shù)
賦值運(yùn)算符= , +=如捅,-=棍现,
算數(shù)運(yùn)算符:+ - * / %
關(guān)系運(yùn)算符:=,镜遣!= 己肮,<,<=,>,>= 產(chǎn)生bool值
邏輯運(yùn)算符&& , || 悲关, ;哑А(與,或坚洽,非)
三元條件運(yùn)算符:戈稿? :
其他運(yùn)算符:[]下標(biāo)運(yùn)算符 , . , ?? 可空類型 有值取前面的 沒值取后面的, ? 讶舰,鞍盗!
字面(常)量:
整數(shù)字面量:10、1_123_567跳昼、0x10般甲、0o10、0b10
小數(shù)字面量:123.45鹅颊、1.245e2敷存、0xab.cdp2
字符字面量:“o”、“\n”"\u{41}" "\u{e9}"
字符串字面量:“hello”
布爾字面量:true堪伍,false
空值字面量:nil
類型字面量:String.self锚烦、
分隔符:將不同的語言元素符號分開
swift中每個(gè)語句后面不用分號,寫代碼時(shí)盡量保證一行只有一條語句這樣就可以省略掉分號帝雇。
循環(huán)和分支結(jié)構(gòu)
循環(huán)
說明:在循環(huán)中可以使用break關(guān)鍵詞來提前終止循環(huán)涮俄,也可以使用continue關(guān)鍵詞循環(huán)直接進(jìn)入下一輪,但是應(yīng)該盡量減少歲break和continue的使用尸闸,因?yàn)樗麄儾粫鼓愕某绦蜃兊酶谩?/p>
var sum=0
for i in 0...9{
sum +=i
}
var sum = 0
var i=0
while i<10{
sum += i
i += 1
}
var sum = 0
var i=0
repeat {
sum += i
i += 1
}while i<10
綜合案列Craps賭博游戲彻亲。
第一輪如果為7或11玩家勝2,3吮廉,12莊家勝 其他下一輪
第二輪如果為7 莊家勝 如果為第一輪出現(xiàn)的點(diǎn) 玩家勝否則繼續(xù)直到分出勝負(fù)
funk roll()->Int{
return Int(rac4drandom_uniform(6)+1)
}
let firstPoint=roll()+roll()
print("玩家搖出了\(firstPoint)")
var needsFoOn = false
swich firstPoint{
case 7,11:
print("玩家勝")
case 2,3,12:
print("莊家勝")
defalt:
needsGoOn=true
}
while needsGoOn{
let currentPoint = roll()+roll()
print("玩家搖出了\(currentPoint)")
if currentPoint==7{
print("莊家勝")
needsGoOn = false
}
else if firstPoint==currentPoint{
print("玩家勝")
needsGoOn = false
}
else{
neesdGoOn = true
}
}
窮舉法:窮盡所有可能性直到找到正確答案
下面的程序?qū)崿F(xiàn)了百錢買百雞問題苞尝;問題的求解。
for i in 0...20{
for j in 0...33{
let k=100-j-i
if 5*i+3*j+k/3==100 &&k%3==0{
print("母雞\(i)公雞\(j)小雞\(k)")
}
}
}
分支
let sales = 700000
if sales <100000 {
print("去找財(cái)務(wù)領(lǐng)工資")
}
else if sales<300000 {
print("還需要加油啊")
}
else if sales <500000 {
print("升值加薪不是夢")
}
else{
print("老板娘就是你啦宦芦!")
}
let score = 90
let msg:String
swich score{
case 100...90: msg="A"
case 80...89:msg="B"
case 60...79:msg="C"
defalt: msg="D"
}
print(msg)
容器
數(shù)組
數(shù)組使用連續(xù)空間保存
-創(chuàng)建數(shù)組
let array:[Int]=[]
let array:Arrat<Int>=[]
let array1 = [1,2,3,4,5]
let array2 = [Int](count:5),repeatedValue:0)
var array3 = Array<Int>(count:5,repeatedValue:0)
-添加元素
array1.append(3)
array1.insert(1,atIndex:0)
array1.insert(4,atIndex:array,count)
array1 +=[5,6,7]
-刪除元素
array1.removeFirst()
array1.removeAtIndex(2)
array1.removeLast()
array1.removeRange(1...2)
array1.removeAll()
-修改元素
array1[0]=100
array1[array1.count-1]=500
-遍歷數(shù)組
//1.
for i in 0..<array1.count{
print(array1[i])
}
//2.
for x in array1{
print(x)
}
for x in array1[1..3]{
print(x)
}
>**for..in循環(huán)是一個(gè)只讀循環(huán)宙址,這也就意味著在循環(huán)過程中不能對其元素進(jìn)行修改**
//3.
for(i,temp)in array1.enumerate(){
if i ==0 {
array[i]=5
}
print("\(i).\(temp)")
}
說明操作數(shù)組時(shí)最重要的是不要越界訪問元素。數(shù)組對象的count屬性表明了數(shù)組中有多少個(gè)元素踪旷,那么有效的小標(biāo)是0...count-1.
數(shù)組中的元素也可以是數(shù)組曼氛,因此我們可以構(gòu)造多維數(shù)組豁辉。最常見的是二維數(shù)組,它相當(dāng)于是一個(gè)有行有列的數(shù)組舀患,數(shù)組中的每個(gè)元素代表一行徽级,該數(shù)組中的每個(gè)元素代表行里面的列。二維數(shù)組可以模擬現(xiàn)實(shí)世界中的表格聊浅,數(shù)學(xué)上的矩陣餐抢。棋類游戲的棋盤·2D游戲中的地圖,所以實(shí)際開發(fā)中使用非常廣泛低匙。
func randomInt(min: UInt32, max: UInt32) -> Int {
return Int(arc4random_uniform(max - min + 1) + min)
}
let namesArray = ["關(guān)羽", "張飛", "趙云", "馬超", "黃忠"]
let coursesArray = ["語文", "數(shù)學(xué)", "英語"]
var scoresArray = [[Double]](count: namesArray.count, repeatedValue: [Double](count: coursesArray.count, repeatedValue: 0))
for i in 0..<scoresArray.count {
for j in 0..<scoresArray[i].count {
scoresArray[i][j] = Double(randomInt(50, max: 100))
}
}
for (index, array) in scoresArray.enumerate() {
var sum = 0.0
for score in array {
sum += score
}
let avg = sum / Double(coursesArray.count)
print("\(namesArray[index])的平均成績?yōu)? \(avg)")
}
for i in 0..<coursesArray.count {
var sum = 0.0
for row in 0..<scoresArray.count {
sum += scoresArray[row][i]
}
let avg = sum / Double(namesArray.count)
print("\(coursesArray[i])課的平均成績?yōu)? \(avg)")
}
集合
集合在內(nèi)存中是離散的旷痕,集合中的元素通過計(jì)算HashCode來決定放在哪個(gè)位置,集合中不允許有重復(fù)元素
-創(chuàng)建集合
let a:Set<Int>=[1,2,3,4,5]
-添加元素
a.insert()
-刪除元素
a.remove(具體的一個(gè)元素)
a.removeAll()
-集合運(yùn)算(交集顽冶、并集欺抗、差集)
交集
set1.intersect(set2)
并集
set1.union(set2)
差集
set1.subtract(set2)
字典
字典是以鍵值對組合的方式保存數(shù)據(jù)的容器,字典中的每個(gè)元素都是鍵值對組合强重,通過鍵可以找到對應(yīng)的值,字典里面的鍵也是采用哈希存儲的
-創(chuàng)建字典
let dict = [
1:"hello",
2:"good",
3:"meili",
4:"laaa"
]
-添加元素
dict[5]="didida"
-刪除元素
dict[5]=nil
dict.removeValueForKey[5]
-修改元素
dict[3]="nice"
-字典的遍歷
for key in dict.keys{
print("\(key)-->\(dict[key]!)")
}
for value indivt.value{
print(value)
}
for (index,value) in dict.enumerate(){
print("\(index).\(value.0)-->\(value.1)")
}
重要操作
1.排序
.sort
.sortInPlance
2.過濾()
array.filter{ 過濾條件 }
//篩選掉不滿足條件的元素
3.映射
//對數(shù)據(jù)按照一定條件進(jìn)行變換處理
array.map{映射條件}
4.歸約
array.reduce(初始值绞呈,combine:歸約方式比如加減乘除什么的)
函數(shù)和閉包
函數(shù)是獨(dú)立的可重復(fù)使用的模塊,如果程序中出現(xiàn)了大量重復(fù)代碼间景,通常都可以把這部分代碼封裝成一個(gè)獨(dú)立函數(shù)佃声。在swift中,函數(shù)是一個(gè)“一等公民” 函數(shù)可以作為類型來使用倘要,也就是說函數(shù)可以賦值給變量或參量圾亏,也可以將函數(shù)作為函數(shù)的參數(shù)或者返回值使用,還可以使用高階函數(shù)
func 函數(shù)名([參數(shù)1:類型封拧,參數(shù)2:類型])[throws||rethrows]->[返回值]{
函數(shù)執(zhí)行體
[return]
}
-外部參數(shù)名
-inout參數(shù)
func swap (inout x:Int,inout y:Int)->Void{
let temp = x
x = y
y = temp
}
var x=5,y=6
swap(&x, y: &y)
print("x=\(x)")
print("y=\(y)")
//inout - 輸入輸出參數(shù)(不僅將數(shù)據(jù)傳入函數(shù)還要從函數(shù)中取出數(shù)據(jù))
-可變參數(shù)列表
func sum(nums:Int...)->Int{
var total = 0
for num in nums {
total += num
}
return total
}
print(sum(15,25,35,77,88,99,58,60,120))
print(sum(25,33))
閉包就是沒有名字的函數(shù)或者稱之為函數(shù)表達(dá)式志鹃,在Oc中叫block。如果一個(gè)函數(shù)的參數(shù)類型是函數(shù)我們可以傳入一個(gè)閉包泽西;如果一個(gè)函數(shù)的返回類型是函數(shù)我們可以返回閉包弄跌;如果一個(gè)類的某個(gè)屬性是函數(shù)我們也可以將一個(gè)閉包表達(dá)式賦值給它。
{([參數(shù)列表])[->返回類型] in 代碼}
面向?qū)ο缶幊蹋╫op)
基本概念
對象:接收消息的單元尝苇,是一個(gè)具體的概念
類:對象的藍(lán)圖和模板 類是一個(gè)抽象概念
消息:對象之間通信的方式,通過給對象發(fā)消息可以讓對象執(zhí)行對應(yīng)的操作來解決問題
四大支柱
抽象:定義類的過程就是一個(gè)抽象的過程埠胖,需要做數(shù)據(jù)抽象和行為抽象糠溜,數(shù)據(jù)抽象找到對象的屬性(保存對象狀態(tài)的存儲屬性),行為抽象找到對象的方法(可以給對象發(fā)的消息)
封裝:觀點(diǎn)一:我們在類中寫的方法其實(shí)就是在封裝API直撤,方法的內(nèi)部實(shí)現(xiàn)可能會很復(fù)雜非竿,但是這些對調(diào)用者來說是不可見的,調(diào)用者只能看到方法有一個(gè)簡單清晰的接口谋竖,這就是封裝
觀點(diǎn)二:將對象的屬性和操作這些屬性的方法綁定在一起红柱。
觀點(diǎn)三:隱藏一切可以隱藏的實(shí)現(xiàn)細(xì)節(jié)承匣,只提供簡單的界面或接口
繼承:得到被繼承方的方法、屬性
多態(tài):同樣的對象接收同樣的消息實(shí)現(xiàn)不同的結(jié)果
三個(gè)步驟
1.定義類
-數(shù)據(jù)抽象
-存儲屬性
-行為抽象
--方法(寫到類里面的函數(shù)就是方法)
-對象方法:給對象發(fā)消息
-類方法:給類發(fā)的消息锤悄,與對象的狀態(tài)無關(guān)
--計(jì)算屬性
-構(gòu)造器
-指派構(gòu)造器
-便利構(gòu)造器
-必要構(gòu)造器
2.創(chuàng)建對象
3.給對象發(fā)消息
相關(guān)內(nèi)容
-枚舉
-結(jié)構(gòu)體
總結(jié)類和結(jié)構(gòu)的區(qū)別到底有哪些韧骗?什么時(shí)候該使用類什么時(shí)候該使用結(jié)構(gòu)
-拓展(extension)
.類的拓展
extension String {
var length: UInt32 {
get { return UInt32(self.characters.count) }
}
subscript(index: Int) -> Character {
get { return self[self.startIndex.advancedBy(index)] }
}
}
.協(xié)議的拓展相當(dāng)于是默認(rèn)執(zhí)行
-運(yùn)算符重載
-下標(biāo)運(yùn)算(subscript)
-訪問修飾符
-private
-internal
-public
面向協(xié)議編程(pop)
protocol 協(xié)議名[:父協(xié)議]{
//方法的集合
}
1.能力:遵循了協(xié)議就意味著具備了某種能力
2.約定:遵循了協(xié)議就一定要實(shí)現(xiàn)協(xié)議中的方法
3.角色:一個(gè)類可以遵循多個(gè)協(xié)議, 一個(gè)協(xié)議可以被多個(gè)類遵循, 遵循協(xié)議就意味著扮演了某種角色, 遵循多個(gè)協(xié)議就意味著可以扮演多種角色
設(shè)計(jì)模式
-代理模式
-委托回調(diào)
-設(shè)計(jì)一個(gè)協(xié)議,被委托方遵循協(xié)議并實(shí)現(xiàn)協(xié)議方法
-委托方有一個(gè)屬性是協(xié)議類型的零聚,通過該屬性可以調(diào)用協(xié)議中的方法
-委托方的協(xié)議類型通常是可空類型袍暴,因?yàn)橐獙懗蓋eak引用
依賴倒轉(zhuǎn)原則
其他
-協(xié)議組合:protocol<協(xié)議1,協(xié)議2隶症,...>
-可選方法
-協(xié)議拓展:對協(xié)議中的方法給出默認(rèn)實(shí)現(xiàn)
泛型
讓類型不再是程序中的硬代碼
-泛型函數(shù)
-泛型類政模,結(jié)構(gòu),枚舉
相關(guān)知識
-泛型限定
-where子句
異常處理
enum Myerror:ErrorTYpe{
case A
case B
case C
}
-throw(拋出錯(cuò)誤)
-rethrows蚂会、throws(提醒這里可能出錯(cuò))
-do(執(zhí)行)
-catch(捕捉錯(cuò)誤)
-try(嘗試執(zhí)行)
邊角知識
-ARC
—正則表達(dá)式
-嵌套類型