
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
新聞熱點
疑難解答