swift學(xué)習(xí)總結(jié)

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á)式
-嵌套類型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淋样,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胁住,更是在濱河造成了極大的恐慌趁猴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件措嵌,死亡現(xiàn)場離奇詭異躲叼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)企巢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門枫慷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浪规,你說我怎么就攤上這事或听。” “怎么了笋婿?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵誉裆,是天一觀的道長。 經(jīng)常有香客問我缸濒,道長足丢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任庇配,我火速辦了婚禮斩跌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捞慌。我一直安慰自己耀鸦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布啸澡。 她就那樣靜靜地躺著袖订,像睡著了一般氮帐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洛姑,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天上沐,我揣著相機(jī)與錄音,去河邊找鬼吏口。 笑死奄容,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的产徊。 我是一名探鬼主播昂勒,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舟铜!你這毒婦竟也來了戈盈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谆刨,失蹤者是張志新(化名)和其女友劉穎塘娶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痊夭,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刁岸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了她我。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虹曙。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖番舆,靈堂內(nèi)的尸體忽然破棺而出酝碳,到底是詐尸還是另有隱情,我是刑警寧澤恨狈,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布疏哗,位于F島的核電站,受9級特大地震影響禾怠,放射性物質(zhì)發(fā)生泄漏返奉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一吗氏、第九天 我趴在偏房一處隱蔽的房頂上張望衡瓶。 院中可真熱鬧,春花似錦牲证、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十厢。三九已至,卻和暖如春捂齐,著一層夾襖步出監(jiān)牢的瞬間蛮放,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工奠宜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留包颁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓压真,卻偏偏與公主長得像娩嚼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子滴肿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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

  • Swift學(xué)習(xí)總結(jié) 語言基礎(chǔ) 程序是指令的集合岳悟,寫程序就是寫一系列的指令去控制計(jì)算機(jī)做我們想做的事情。編譯:將程序...
    BruceChenn閱讀 476評論 0 0
  • Swift學(xué)習(xí)總結(jié) 語言基礎(chǔ) 程序是指令的集合泼差,寫程序就是寫一系列的指令去控制計(jì)算機(jī)做我們想做的事情贵少。編譯:將程序...
    奈何乘風(fēng)閱讀 370評論 0 1
  • 數(shù)據(jù)類型 內(nèi)置數(shù)據(jù)類型 Swift 提供了非常豐富的數(shù)據(jù)類型,以下列出了常用了集中數(shù)據(jù)類型: Int 一般來說堆缘,你...
    陽明先生1208閱讀 199評論 0 0
  • 翅 斷裂在土里 撲騰幾下 撞到頭頂?shù)挠彩?挪走移掉 有流出血的 種子在萌發(fā) 隱約模糊 觸不到
    7_涵澈閱讀 153評論 0 0
  • 早飯后滔灶,媽媽說:生活啊就是一堆永遠(yuǎn)也洗不完的碗,上頓洗下頓洗吼肥。爸爸說:生活啊就是一碗吃不夠的囊湯面录平,今天吃明天...
    青門綠房閱讀 268評論 0 1