自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Swift高級(jí)語(yǔ)法學(xué)習(xí)總結(jié)

移動(dòng)開(kāi)發(fā) iOS
本文主要總結(jié)了Swift的高級(jí)語(yǔ)法其中包括:函數(shù),閉包,枚舉,結(jié)構(gòu)體,屬性(成員變量),函數(shù)(成員方法),角標(biāo)(subscript),繼承……

1.函數(shù)

1.1 func funcNmae()->(){} 這樣就定義了一個(gè)函數(shù),它的參數(shù)為空,返回值為空,如果有參數(shù)和返回值直接寫(xiě)在兩個(gè)括號(hào)里就可以了

1.2 參數(shù)需要指明類(lèi)型,而如果沒(méi)有返回值可以不寫(xiě)->(),返回值只需要寫(xiě)返回類(lèi)型,如果寫(xiě)了返回名稱(chēng),可以在函數(shù)調(diào)用后的值用點(diǎn)語(yǔ)法訪問(wèn)

1.3 在參數(shù)名稱(chēng)前可以加上外部參數(shù)名,調(diào)用的時(shí)候就可以帶上它了,如果外部參數(shù)名和內(nèi)部參數(shù)名相同則可以直接在內(nèi)部參數(shù)名前加#即可

1.4 如果跟參數(shù)設(shè)置一個(gè)默認(rèn)值,則swift會(huì)自動(dòng)加上外部參數(shù)名,如果不想有在前面用下劃線就可以_,如果默認(rèn)值參數(shù)不在***則不能省略,在傳參時(shí)傳一個(gè)下劃線進(jìn)去就可以

1.5 在***一個(gè)參數(shù)后面加...代表是這個(gè)參數(shù)是可變參數(shù)并且類(lèi)型就是它,參數(shù)個(gè)數(shù)至少是0個(gè),在函數(shù)內(nèi)可以使用for in 這個(gè)參數(shù)獲得 這些參數(shù)

1.6 每個(gè)參數(shù)前面其實(shí)有一個(gè)隱藏的關(guān)鍵字let,如果想讓參數(shù)可變(可賦值)則需要加上var關(guān)鍵字,不過(guò)也只是能賦值,因?yàn)槭侵悼截愃圆荒苄薷耐獠繀?shù)的實(shí)際值,如果要變成地址傳遞,需要在參數(shù)前加inout 關(guān)鍵字,而實(shí)參需要加上& ,

1.7 swift中函數(shù)其實(shí)也只是中類(lèi)型,函數(shù)名就是變量名,比如let func1 : () -> () 聲明的就是個(gè)無(wú)參數(shù)無(wú)返回值的函數(shù)類(lèi)型,所以如果一個(gè)函數(shù)返回一個(gè)函數(shù)的話和返回一個(gè)普通變量沒(méi)什么區(qū)別

2.閉包

2.1 閉包代表了一段程序代碼,{ (傳入?yún)?shù)) -> 返回值的類(lèi)型 in ... 表達(dá)式 ... },函數(shù)只是閉包的一個(gè)特例

2.2 閉包可以推斷返回類(lèi)型,所以可以省略->返回值類(lèi)型,參數(shù)類(lèi)型也可以推到,所以參數(shù)類(lèi)型也不要,括號(hào)也可以去掉,如果閉包只有一個(gè)表達(dá)式直接可以省略掉return關(guān)鍵字,因?yàn)槲覀兛梢杂?0/$1簡(jiǎn)寫(xiě)參數(shù),所以參數(shù)也可以省略掉.

2.3如果閉包是函數(shù)***一個(gè)參數(shù),則可以去掉小括號(hào),直接用大括號(hào)里的內(nèi)容,不過(guò)需要大括號(hào)緊接著寫(xiě),叫尾隨閉包

2.4 內(nèi)層返回函數(shù)會(huì)捕獲外層的變量的值,當(dāng)內(nèi)層函數(shù)返回后,外層函數(shù)的內(nèi)部變量并不會(huì)釋放內(nèi)存,它的變量的值會(huì)跟著內(nèi)部函數(shù)的執(zhí)行而變化

3.枚舉

3.1 用enum CompassPoint{ case North, South , East, West}定義枚舉,可以不用逗號(hào),和聲明語(yǔ)句一樣分開(kāi)用多個(gè)case寫(xiě)就可以了

3.2 可以用元組來(lái)設(shè)定枚舉對(duì)應(yīng)每項(xiàng)中的值,并可以用switch case 中的值綁定來(lái)判斷,

3.3 枚舉類(lèi)型如果初始化為Int類(lèi)型,它的下一項(xiàng)也會(huì)有一個(gè)加1的原始值,不過(guò)枚舉直接復(fù)制成string都可以的

4.結(jié)構(gòu)體

4.1 結(jié)構(gòu)題的屬性必須初始化,必須有默認(rèn)值或者通過(guò)構(gòu)造器init

4.2 結(jié)構(gòu)體本身是值傳遞,如果一個(gè)結(jié)構(gòu)體賦值給另外一個(gè)結(jié)構(gòu)體了也是兩份拷貝,互相修改不會(huì)有影響

4.3 如果一個(gè)結(jié)構(gòu)體用let聲明了,那么它內(nèi)部的值就不能再做修改了,var聲明的結(jié)構(gòu)體才能修改

4.4 但是class不同,對(duì)象的賦值會(huì)是同一份引用,修改會(huì)影響到另外一個(gè)對(duì)象,但是let 聲明的變量也是不能賦值的,只是能修改它內(nèi)部的值而已

5.屬性(成員變量)

5.1 結(jié)構(gòu)體/類(lèi)在初始化的時(shí)候成員變量一定要有值,如果你沒(méi)有給出初始化方法,則默認(rèn)有一個(gè)包含所有必須初始化的的init方法,如果你提供了,默認(rèn)了就沒(méi)有了

5.2 (延遲屬性)用let聲明的成員變量,就不能再修改了,如果是一個(gè)耗時(shí)的屬性比如值是一個(gè)自定義對(duì)象,可以加上lazy屬性,它只有在用到的時(shí)候才會(huì)對(duì)這個(gè)屬性做初始化,避免不要的消耗(延遲屬性)

5.3 (計(jì)算屬性)有的屬性是根據(jù)其它的屬性計(jì)算出來(lái)的,并不是一個(gè)必須的屬性,只是讓使用的時(shí)候方便了些,在屬性定義后面加上set/get方法,get方法需要返回一個(gè)值,set方法有一個(gè)參數(shù),用來(lái)設(shè)置其它屬性,如果不要參數(shù)就不要寫(xiě)參數(shù)外面的括號(hào),它就有一個(gè)默認(rèn)的參數(shù)newValue

5.4 如果只有g(shù)et方法就是只讀屬性,只讀屬性swift提供了一種簡(jiǎn)寫(xiě)方式,直接把返回語(yǔ)句寫(xiě)在最外面的大括號(hào)里就可以了

5.5 swift提供了屬性監(jiān)聽(tīng)方法:willSet和didSet,兩個(gè)都是一樣有一個(gè)參數(shù),分別將要設(shè)置的值,和屬性過(guò)去的值,同樣你如果不提供參數(shù),會(huì)用兩個(gè)默認(rèn)的newValue和oldValue.這兩個(gè)方法和set/get方法并列,在didSet方法中可以直接修改(調(diào)整)屬性的值,但是這兩個(gè)方法不能和set/get方法共存

5.6 swift中有類(lèi)別屬性,enum/struct 用關(guān)鍵字static,class就用class關(guān)鍵字,在class中l(wèi)et 聲明的需要直接賦初始值,var聲明的必須用get方法return,因?yàn)閟wift不允許class儲(chǔ)存類(lèi)屬性,而enum/struct可以

6.函數(shù)(成員方法)

6.1 class中的函數(shù)都不需要加上外部參數(shù),因?yàn)槌?**個(gè)參數(shù)都默認(rèn)加上了#符號(hào),不過(guò)這只是swift幫你做了點(diǎn)事情而已,它并沒(méi)有在語(yǔ)法上強(qiáng)制你做什么,你想為***個(gè)參數(shù)加上外部參數(shù)也行,都用_代替默認(rèn)的外部參數(shù)都可以

6.2 在swift里self.x不代表會(huì)調(diào)用setX/getX方法,所以直接可以在set/get方法里這么用.

6.3 在struct和enum中,成員方法不允許修改成員變量,如果要修改需要加上mutating關(guān)鍵字,但是如果聲明的結(jié)構(gòu)體變量是一個(gè)let常量的話,這個(gè)方法也是不允許調(diào)用的.

6.4 在struct和enum中你可以在mutating方法中直接跟self賦值成另外一個(gè)變量

6.5 在struct和enmu中用static標(biāo)識(shí)一個(gè)方法是類(lèi)方法,而class中用class關(guān)鍵字

7.角標(biāo)(subscript)

7.1 重寫(xiě)subscript,類(lèi)似于subscript(index: Int) -> Int{},里面寫(xiě)set/get方法,和聲明變量,根據(jù)傳參和返回值來(lái)確定下標(biāo)的類(lèi)型和返回值,重寫(xiě)了這個(gè)方法這個(gè)對(duì)應(yīng)的類(lèi)型就可以用角標(biāo)了.

7.2 subscript方法參數(shù)的個(gè)數(shù)對(duì)應(yīng)角標(biāo)的個(gè)數(shù),例如兩個(gè)參數(shù):mar[2,3]

8.繼承

8.1 swift中沒(méi)有基礎(chǔ)類(lèi),所有不繼承其它類(lèi)的的類(lèi)都是基礎(chǔ)類(lèi),重寫(xiě)父類(lèi)中init方法,要先調(diào)用super的init方法,然后再在后面修改屬性的值,訪問(wèn)屬性直接用屬性名字就可以了,不用用self等.

8.2 要重寫(xiě)屬性和重寫(xiě)方法類(lèi)似,直接加個(gè)override就好了,在重寫(xiě)的set/get方法也可以調(diào)用super對(duì)應(yīng)的屬性值,或設(shè)置值都可以.

8.3 覆蓋了didSet屬性監(jiān)視器就不能再覆蓋set/get方法了,跟方法或?qū)傩约由蟜inal關(guān)鍵字可以防止被子類(lèi)覆蓋

9.初始化(init)

9.1 init方法和普通方法一樣,你需要在init方法中把每個(gè)必須要賦值的屬性都賦值,否則會(huì)出編譯錯(cuò)誤,init方法會(huì)給每個(gè)參數(shù)加上#,不要它的話可以用_,在方法內(nèi)部用self訪問(wèn),也可以不用

9.2 如果你自定義了init方法,那么swift會(huì)不再提供默認(rèn)的init方法,你可以自己寫(xiě)一個(gè)init方法,init方法帶不帶參數(shù)什么都是可以的,自己決定就行

9.3 如果你想一個(gè)init方法中調(diào)用另一個(gè)init方法,需要加上一個(gè)convenience關(guān)鍵字,在這個(gè)init方法里就可以調(diào)用另一個(gè)init方法了

9.4 在子類(lèi)繼承父類(lèi)的時(shí)候,首先需要初始化子類(lèi)的成員變量,然后才能調(diào)用super的init方法初始化父類(lèi)的屬性,***可以修改子類(lèi)和父類(lèi)的屬性,如果這個(gè)屬性是父類(lèi)的,在子類(lèi)中也是用self訪問(wèn),因?yàn)檫@個(gè)屬性已經(jīng)是它自己的了

9.5 如果子類(lèi)一個(gè)init方法都沒(méi)有提供,那么子類(lèi)繼承父類(lèi)所有的構(gòu)造器,可以用父類(lèi)的init方法初始化

9.6 在初始化屬性的時(shí)候,可以用閉包實(shí)現(xiàn),只要在復(fù)制的=后面加上{},你們寫(xiě)return和其它語(yǔ)句,***在{}后面加一個(gè)()表示閉包立刻執(zhí)行,閉包和屬性的set方法是類(lèi)似的,只是在最開(kāi)始提供的

10.銷(xiāo)毀方法(deinit)

10.1 deinit方法會(huì)在對(duì)象銷(xiāo)毀的時(shí)候調(diào)用,可以打印判斷它時(shí)候銷(xiāo)毀

11.內(nèi)存管理(ARC)

11.1 可選類(lèi)型或者普通類(lèi)型屬性只要對(duì)一個(gè)對(duì)象有一個(gè)引用,它的這個(gè)對(duì)象的引用計(jì)數(shù)就要加1,如果兩個(gè)對(duì)象相互引用就會(huì)產(chǎn)生引用循環(huán),所以需要跟其中的一個(gè)屬性用關(guān)鍵字weak聲明為弱引用,就是可以設(shè)置為nil

11.2 一般用weak聲明的用可選類(lèi)型,因?yàn)樗玫目赡転閚il,如果你在調(diào)用的時(shí)候能確定它是有值的,你可以聲明為unowned的普通類(lèi)型,它的效果是如果你能保證調(diào)用這個(gè)屬性時(shí)不為nil時(shí),swift建議用unowned,其它都和weak一樣的

12.可選鏈(Optional Chaining)

12.1 對(duì)于一個(gè)可選類(lèi)型的屬性可以用?.和!.來(lái)訪問(wèn),如果確定有值可以用a!.b!.c!.d,如果不確定有值可以用a?.b?.c?.d

13.類(lèi)型轉(zhuǎn)化

13.1 可以用 a is b 來(lái)判斷對(duì)象a是否是b類(lèi)型,返回值是一個(gè)boolean類(lèi)型的值

13.2 as 可以把普通類(lèi)型轉(zhuǎn)化,比如double,int,cgfloat之類(lèi)都可以用它轉(zhuǎn)化

13.3 可以用 as? 把之類(lèi)轉(zhuǎn)化成父類(lèi),它的結(jié)果可以是nil或者轉(zhuǎn)型成功,所以結(jié)果是一個(gè)可選類(lèi)型,轉(zhuǎn)化成功后用?.來(lái)訪問(wèn)方法或?qū)傩?也可以做可選綁定.

13.4 如果一個(gè)對(duì)象一定可以轉(zhuǎn)化成功,則可以用as!轉(zhuǎn)化,如果轉(zhuǎn)化不成功會(huì)報(bào)運(yùn)行時(shí)錯(cuò)誤,比如在一個(gè)數(shù)組中全是animal,但是聲明時(shí)是anyobject就可以這樣用.

14.擴(kuò)展/協(xié)議(categories,extension,protocol)

14.1 swift的extension沒(méi)有名稱(chēng),它是擴(kuò)展到所有的實(shí)體類(lèi)的,它不可以增加成員屬性,但是可以增加計(jì)算屬性

14.2 可以在protocol中聲明屬性和方法,可以定義屬性時(shí)候是只讀的或者是可讀可寫(xiě)的

14.3 可以讓一個(gè)extension繼承一個(gè)protocol,在里面實(shí)現(xiàn)對(duì)應(yīng)的方法

14.4 協(xié)議的類(lèi)型是protocol<protcl1,protcl2>

15.泛型

15.1 可以在func或struct后面跟上<T1,T2>,在參數(shù)中就可以聲明參數(shù)類(lèi)型為這個(gè)類(lèi)型,完全可以把它看做是一個(gè)類(lèi)型

16.運(yùn)算符重載

16.1 在swift中運(yùn)算符可以重載,方法名就是運(yùn)算符號(hào),參數(shù)的個(gè)數(shù)和類(lèi)型是根據(jù)它是幾目運(yùn)算符和運(yùn)算符兩邊對(duì)應(yīng)的參數(shù)類(lèi)型決定的.

責(zé)任編輯:chenqingxiang 來(lái)源: Hekui的博客
相關(guān)推薦

2015-07-07 10:43:59

Swift語(yǔ)法基礎(chǔ)

2009-09-10 13:54:27

LINQ語(yǔ)法

2010-05-27 17:56:39

MySQL存儲(chǔ)過(guò)程

2011-08-05 14:16:47

Objective-C 變量 方法

2011-08-18 15:19:28

XcodeObjective-C語(yǔ)法

2009-08-21 18:01:32

C#匿名方法

2009-08-12 17:32:44

C#反射方法

2009-08-18 12:52:33

C#枚舉類(lèi)型

2016-06-02 15:10:12

SwiftSelector

2017-05-26 10:15:39

Java高級(jí)特性反射

2017-05-10 15:41:29

機(jī)器學(xué)習(xí)算法數(shù)據(jù)

2009-08-27 09:27:49

C#擴(kuò)展方法

2009-08-31 16:51:11

C# Main()方法

2017-03-17 09:12:13

基礎(chǔ)算法路線

2009-08-14 17:38:08

C#改寫(xiě)方法

2010-09-06 13:59:23

CSS縮寫(xiě)

2010-01-25 11:21:01

C++語(yǔ)法

2009-10-14 09:27:30

VB.NET編碼算法

2009-08-14 09:41:03

C#遺傳算法

2009-12-14 14:01:29

Linux學(xué)習(xí)方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)