Swift基礎語法學習總結
Swift高級語法學習總結
Swift語法總結補充(一)html
1.函數
1.1 func funcNmae()->(){} 這樣就定義了一個函數,它的參數爲空,返回值爲空,若是有參數和返回值直接寫在兩個括號裏就能夠了
1.2 參數須要指明類型,而若是沒有返回值能夠不寫->(),返回值只須要寫返回類型,若是寫了返回名稱,能夠在函數調用後的值用點語法訪問
1.3 在參數名稱前能夠加上外部參數名,調用的時候就能夠帶上它了,若是外部參數名和內部參數名相同則能夠直接在內部參數名前加#便可
1.4 若是跟參數設置一個默認值,則swift會自動加上外部參數名,若是不想有在前面用下劃線就能夠_,若是默認值參數不在最後則不能省略,在傳參時傳一個下劃線進去就能夠
1.5 在最後一個參數後面加...表明是這個參數是可變參數而且類型就是它,參數個數至少是0個,在函數內可使用for in 這個參數得到 這些參數
1.6 每一個參數前面其實有一個隱藏的關鍵字let,若是想讓參數可變(可賦值)則須要加上var關鍵字,不過也只是能賦值,由於是值拷貝因此不能修改外部參數的實際值,若是要變成地址傳遞,須要在參數前加inout 關鍵字,而實參須要加上& ,
1.7 swift中函數其實也只是中類型,函數名就是變量名,好比let func1 : () -> () 聲明的就是個無參數無返回值的函數類型,因此若是一個函數返回一個函數的話和返回一個普通變量沒什麼區別
2.閉包
2.1 閉包表明了一段程序代碼,{ (傳入參數) -> 返回值的類型 in ... 表達式 ... },函數只是閉包的一個特例
2.2 閉包能夠推斷返回類型,因此能夠省略->返回值類型,參數類型也能夠推到,因此參數類型也不要,括號也能夠去掉,若是閉包只有一個表達式直接能夠省略掉return關鍵字,由於咱們能夠用$0/$1簡寫參數,因此參數也能夠省略掉.
2.3若是閉包是函數最後一個參數,則能夠去掉小括號,直接用大括號裏的內容,不過須要大括號緊接着寫,叫尾隨閉包
2.4 內層返回函數會捕獲外層的變量的值,當內層函數返回後,外層函數的內部變量並不會釋放內存,它的變量的值會跟着內部函數的執行而變化
3.枚舉
3.1 用enum CompassPoint{ case North, South , East, West}定義枚舉,能夠不用逗號,和聲明語句同樣分開用多個case寫就能夠了
3.2 能夠用元組來設定枚舉對應每項中的值,並能夠用switch case 中的值綁定來判斷,
3.3 枚舉類型若是初始化爲Int類型,它的下一項也會有一個加1的原始值,不過枚舉直接複製成string均可以的
4.結構體
4.1 結構題的屬性必須初始化,必須有默認值或者經過構造器init
4.2 結構體自己是值傳遞,若是一個結構體賦值給另一個結構體了也是兩份拷貝,互相修改不會有影響
4.3 若是一個結構體用let聲明瞭,那麼它內部的值就不能再作修改了,var聲明的結構體才能修改
4.4 可是class不一樣,對象的賦值會是同一份引用,修改會影響到另一個對象,可是let 聲明的變量也是不能賦值的,只是能修改它內部的值而已
5.屬性(成員變量)
5.1 結構體/類在初始化的時候成員變量必定要有值,若是你沒有給出初始化方法,則默認有一個包含全部必須初始化的的init方法,若是你提供了,默認了就沒有了
5.2 (延遲屬性)用let聲明的成員變量,就不能再修改了,若是是一個耗時的屬性好比值是一個自定義對象,能夠加上lazy屬性,它只有在用到的時候纔會對這個屬性作初始化,避免不要的消耗(延遲屬性)
5.3 (計算屬性)有的屬性是根據其它的屬性計算出來的,並非一個必須的屬性,只是讓使用的時候方便了些,在屬性定義後面加上set/get方法,get方法須要返回一個值,set方法有一個參數,用來設置其它屬性,若是不要參數就不要寫參數外面的括號,它就有一個默認的參數newValue
5.4 若是隻有get方法就是隻讀屬性,只讀屬性swift提供了一種簡寫方式,直接把返回語句寫在最外面的大括號裏就能夠了
5.5 swift提供了屬性監聽方法:willSet和didSet,兩個都是同樣有一個參數,分別將要設置的值,和屬性過去的值,一樣你若是不提供參數,會用兩個默認的newValue和oldValue.這兩個方法和set/get方法並列,在didSet方法中能夠直接修改(調整)屬性的值,可是這兩個方法不能和set/get方法共存
5.6 swift中有類別屬性,enum/struct 用關鍵字static,class就用class關鍵字,在class中let 聲明的須要直接賦初始值,var聲明的必須用get方法return,由於swift不容許class儲存類屬性,而enum/struct能夠
6.函數(成員方法)
6.1 class中的函數都不須要加上外部參數,由於除了第一個參數都默認加上了#符號,不過這只是swift幫你作了點事情而已,它並無在語法上強制你作什麼,你想爲第一個參數加上外部參數也行,都用_代替默認的外部參數均可以
6.2 在swift裏self.x不表明會調用setX/getX方法,因此直接能夠在set/get方法裏這麼用.
6.3 在struct和enum中,成員方法不容許修改爲員變量,若是要修改須要加上mutating關鍵字,可是若是聲明的結構體變量是一個let常量的話,這個方法也是不容許調用的.
6.4 在struct和enum中你能夠在mutating方法中直接跟self賦值成另一個變量
6.5 在struct和enmu中用static標識一個方法是類方法,而class中用class關鍵字
7.角標(subscript)
7.1 重寫subscript,相似於subscript(index: Int) -> Int{},裏面寫set/get方法,和聲明變量,根據傳參和返回值來肯定下標的類型和返回值,重寫了這個方法這個對應的類型就能夠用角標了.
7.2 subscript方法參數的個數對應角標的個數,例如兩個參數:mar[2,3]
8.繼承
8.1 swift中沒有基礎類,全部不繼承其它類的的類都是基礎類,重寫父類中init方法,要先調用super的init方法,而後再在後面修改屬性的值,訪問屬性直接用屬性名字就能夠了,不用用self等.
8.2 要重寫屬性和重寫方法相似,直接加個override就行了,在重寫的set/get方法也能夠調用super對應的屬性值,或設置值均可以.
8.3 覆蓋了didSet屬性監視器就不能再覆蓋set/get方法了,跟方法或屬性加上final關鍵字能夠防止被子類覆蓋
9.初始化(init)
9.1 init方法和普通方法同樣,你須要在init方法中把每一個必需要賦值的屬性都賦值,不然會出編譯錯誤,init方法會給每一個參數加上#,不要它的話能夠用_,在方法內部用self訪問,也能夠不用
9.2 若是你自定義了init方法,那麼swift會再也不提供默認的init方法,你能夠本身寫一個init方法,init方法帶不帶參數什麼都是能夠的,本身決定就行
9.3 若是你想一個init方法中調用另外一個init方法,須要加上一個convenience關鍵字,在這個init方法裏就能夠調用另外一個init方法了
9.4 在子類繼承父類的時候,首先須要初始化子類的成員變量,而後才能調用super的init方法初始化父類的屬性,最後能夠修改子類和父類的屬性,若是這個屬性是父類的,在子類中也是用self訪問,由於這個屬性已是它本身的了
9.5 若是子類一個init方法都沒有提供,那麼子類繼承父類全部的構造器,能夠用父類的init方法初始化
9.6 在初始化屬性的時候,能夠用閉包實現,只要在複製的=後面加上{},大家寫return和其它語句,最後在{}後面加一個()表示閉包馬上執行,閉包和屬性的set方法是相似的,只是在最開始提供的
10.銷燬方法(deinit)
10.1 deinit方法會在對象銷燬的時候調用,能夠打印判斷它時候銷燬
11.內存管理(ARC)
11.1 可選類型或者普通類型屬性只要對一個對象有一個引用,它的這個對象的引用計數就要加1,若是兩個對象相互引用就會產生引用循環,因此須要跟其中的一個屬性用關鍵字weak聲明爲弱引用,就是能夠設置爲nil
11.2 通常用weak聲明的用可選類型,由於它引用的可能爲nil,若是你在調用的時候能肯定它是有值的,你能夠聲明爲unowned的普通類型,它的效果是若是你能保證調用這個屬性時不爲nil時,swift建議用unowned,其它都和weak同樣的
12.可選鏈(Optional Chaining)
12.1 對於一個可選類型的屬性能夠用?.和!.來訪問,若是肯定有值能夠用a!.b!.c!.d,若是不肯定有值能夠用a?.b?.c?.d
13.類型轉化
13.1 能夠用 a is b 來判斷對象a是不是b類型,返回值是一個boolean類型的值
13.2 as 能夠把普通類型轉化,好比double,int,cgfloat之類均可以用它轉化
13.3 能夠用 as? 把之類轉化成父類,它的結果能夠是nil或者轉型成功,因此結果是一個可選類型,轉化成功後用?.來訪問方法或屬性,也能夠作可選綁定.
13.4 若是一個對象必定能夠轉化成功,則能夠用as!轉化,若是轉化不成功會報運行時錯誤,好比在一個數組中全是animal,可是聲明時是anyobject就能夠這樣用.
14.擴展/協議(categories,extension,protocol)
14.1 swift的extension沒有名稱,它是擴展到全部的實體類的,它不能夠增長成員屬性,可是能夠增長計算屬性
14.2 能夠在protocol中聲明屬性和方法,能夠定義屬性時候是隻讀的或者是可讀可寫的
14.3 可讓一個extension繼承一個protocol,在裏面實現對應的方法
14.4 協議的類型是protocol<protcl1,protcl2>
15.泛型
15.1 能夠在func或struct後面跟上<T1,T2>,在參數中就能夠聲明參數類型爲這個類型,徹底能夠把它看作是一個類型
16.運算符重載
16.1 在swift中運算符能夠重載,方法名就是運算符號,參數的個數和類型是根據它是幾目運算符和運算符兩邊對應的參數類型決定的.swift