swift 基礎

swift 基礎:java


swift 是徹底由一個工程師設計完成,編譯型語言和腳本語言的結合,編譯型語音就是須要保證每一行都經過編譯纔可以運行,編譯語言功能更強大,腳本語言功能更靈活,不須要代碼徹底經過編譯,能執行一行代碼就執行一行代碼,直到執行到錯誤的代碼行後,才中止運行代碼c++


swift 的首席架構師是 chris lattner,是 llvm 項目的主要發起人和做者之一(llvm 項目即編譯器),clang 編譯器的做者。算法


swift 基礎語法:json

源文件拓展名是 .swift swift

不須要編寫 main 函數,swift 代碼是按順序執行的,最前面的代碼就是程序的入口數組

swift 能夠不寫分號,也能夠寫xcode

多行註釋能夠嵌套了,不會報錯安全

let 常量,var 變量,均可以一行聲明多個,閉包

若是代碼中有 override 關鍵字,那麼說明這個方法是繼承自父類的方法架構

swift 中使用 「.」 點來調用方法,而不是中括號,

xcode 中的 playground 能夠即時看到一些簡單代碼的效果

swift 中的字符串 使用 \() 進行插值操做;可使用 + 號來進行字符串的拼接,可是隻能是字符串和字符串進行拼接,能夠有對應方法將非字符串轉成字符串類型的變量

命名仍是不能以數字開頭

新加了兩種數據類型:Tuple:元祖類型,Optional:可選類型,數據類型名強制開頭大寫

swift 強制變量使用以前必須初始化,swift 不會自動爲變量賦初始值

對於數據類型,可使用 min 和 max 方法來得到這個數據類型的最小值和最大值

對於 int 類型,有8,18,32,64位 不一樣的類型,若是省略位數不寫,使用 int 自適應當前系統的位數,一般不用在乎這一點內存的使用,一般使用 int 自適應

swift 是強類型語音,是類型安全語言,不一樣類型的數據是不可以進行操做的。包括位數不一樣,

swift 默認是不支持數據溢出的

double 類型至少有15位小數,float 至少有6位小數,默認是 double,表示指數的方式有兩種,一種是 e,對應十進制,10的 x 次方,一種是 p,對應16進制,2的 x 次方,10進制小數能夠沒有指數,也能夠有,可是16進制的小數必定要有指數後綴

使用 typealias來定義類型的別名,alias 就是別名,化名的意思,相似於 c 語言的 typedef,在 c 中,是這麼寫的 typedef int myint,即 myint 就是 int 類型的別名了,在 swift 中是這麼寫的,typealias Myint = Int,記住 swift強制類型名 首大寫

swift 運算符多了一些,好比範圍運算符,溢出運算符,和 c 和 oc 不同的是,swift 的賦值運算符沒有返回值,在 c 或者 oc 中,賦值運算符是有返回值的,好比 int a = 10;int b = a = 10;是合法的,由於 a = 10 是有一個返回值的,能夠賦值給 b,在 swift 中是不容許的,由於在 c 中,只要非0就是真,swift 爲了防止把 == 誤寫爲 = ,設置了這麼一個機制:賦值運算符沒有返回值。

還有求餘運算符,swift 中可以支持小數的取餘操做

bool 類型,只有兩種取值:true,false,c 中只要非0都是就是真,可是 swift 中只有 true 纔是真,只有這麼一個真,假也只有 false 纔是假,0也不是假,swift 是強類型語言,bool 就是 bool,int 就是 int,是徹底不一樣的類型,再也不是 c 中的模糊界限的語言。這點要注意。

範圍運算符,有兩種,閉合範圍「...」和半閉合範圍「..<」,多用於 for 循環中。

溢出運算符,只能用在整形數值中,以&開頭的就是溢出操做符,當數據溢出以後,不會報錯,只會取對應的位數的值,這就是溢出運算符的做用,包括上溢出和下溢出,就是若是溢出了就在最大值和最小值之間來回循環,還有除0溢出,使用溢出除法就能夠除以0

元祖運算符,元祖類型是由 N 個任意類型的數據組成的類型,組成元祖的成員稱爲元素,N>=0,能夠有空元祖,元素能夠是用「。」來訪問元素,還可使用下標來訪問元素,訪問方式就像結構體和數組的混合,使用元素名稱或者元素位置均可以訪問對應的元素,元祖也有 var 和 let 的區分,能夠輸出整個元祖來查看全部的元祖元素,直接打印元祖變量或者常量名就能夠打印了,元素的名稱也是能夠省略的,元祖的元素是有順序的,元素能夠是任意類型,可是不可以修改對應位置的元素的類型,只可以修改這個位置的元素的值,而且若是明確指定了元素的類型,那麼就不可以再同時指定這個元素的名稱,元素名稱和元素類型是不可以共存的,若是在對應的元素位置使用「_」,表示忽略掉這個位置的元素,

swift 的流程控制,全部的流程控制以後都必須有大括號,在 c 或者 oc 中能夠沒有大括號,好比 if,swift 中任何流程控制都必須有大括號。新加入的有 for in 循環,好比 for a in b{。。。},b 是一個範圍,a 是這個範圍內的每個最小分塊,這個範圍內有多少分塊,就執行多少次循環,每次都會賦值給 a,每一次循環執行一次 大括號中的代碼,若是不須要使用範圍中的值,可使用「_」來忽略 a 的值,定義 a 有時候也會消耗必定的內存,要注意的是 a 在這個循環中是一個常量,而不是變量,因此每一次循環都會新建一個常量 a,若是不須要使用,那麼最好用「_」來代替。「_」能夠認爲是忽略這個位置的值或者這個位置上能夠取對應類型的全部值

switch:swift 中的 switch 能夠匹配數值,字符串,而且能夠省略 break 不寫,若是須要穿透執行就使用 fallthrough 關鍵字來聲明穿透一個 case 語句或者 default 語句,使用 fallthrough 要注意的是以後的 case 或者 default 語句中不可以定義常量或者變量,而且在 swift 中的 switch 的每個 case 中都必須有執行語句,若是要忽略某個或者某些 case,那麼在這些 case 中的語句寫成 break 便可,每一個 case 能夠完成多條件匹配,每一個條件使用逗號隔開便可,由於沒有穿透執行,全部使用多條件匹配更方便,case 還可以進行範圍匹配,可是匹配的值只能是一個值,這個值能夠是 case 中的一個範圍以內,而且 case 要有完備性,全部 switch 要匹配的值的可能性都要考慮到,不必定要寫 default,前提是全部的 case 實現了完備性,若是沒有,就必須是用 default 來實現完備性,switch 的匹配還可以是元祖,元祖意味着是能夠有多種類型的元素的, 那麼 case 中的條件也是元祖,任意的元祖。而且在 case 匹配的同時,能夠在 case 條件 中的某個值綁定給一個特定的常量或者變量,以便在 case 的執行語句中使用,相似於使用「_」,不一樣的是這個忽略的值能夠經過變量名或者常量名明確在語句中使用。switch 中還新增了一個 where,經過 where 能夠增長一些匹配的約束條件,

標籤,用於跳出循環時指示編譯器是跳出的哪一個循環。用法是 標籤名:循環,通常爲了方便查看,冒號以後會換行再寫循環。

swift 中的函數,和 c 和 oc 中的也有略微不一樣,格式是:func 函數名 (形參列表)-> 返回值類型{。。。。函數語句。。。。},在形參列表中,定義一個形參是先寫形參名,加上冒號以後再寫形參類型,如 形參名1:形參類型,。。。

和 oc 中順序是相反的。函數若是沒有返回值,那麼 swift 中的返回類型有3中寫法,第1種是寫 Void 類型,第2中是隻寫()空括號,第3種是什麼都不寫,可是若是是沒有參數,那麼參數列表的小括號不可以省略。返回類型還可以返回一個元祖類型的數據,返回值中的元祖中的元素名能夠不寫(也能夠寫,若是有元素名那麼就能夠經過元素名來訪問元素),只寫元祖元素的數據類型。swift 函數中還有一個新特性,外部參數名,用於修飾參數,能夠在傳入參數時能夠更明確這個參數的實際意義,由於在調用函數時是不使用形參名的,形參名只在函數內部使用,若是加入了外部參數名,就能夠更明確的知道這個參數所表明的意思,外部參數名寫在形參名以前便可,若是但願外部參數名和形參名相同,那麼形參名前加上#號就能夠定義一個同名的外部參數名了,若是定義了外部參數名,那麼在調用函數時必定要使用外部參數名。swift 中函數還有默認參數值的機制,能夠在定義形參的時候加入一個默認參數值,那麼再使用這個函數的時候這個參數能夠不傳入實際參數值,而是使用默認參數值,若是傳入了實參,那麼就會覆蓋掉默認值,而且帶有默認值的形參,系統會自動定義一個同名的外部參數名,不用再加#號,也就意味着再傳入對應的實參時,必須使用這個外部參數名,若是使用的默認參數值,也就是沒有傳入實參,那麼就不用使用外部參數名了,若是不想寫外部參數名,那麼可使用「_」來代替 i這個外部參數名,在調用函數傳入實參時就能夠不寫這個外部參數名了,「_」表示忽略一切。在 c++ 中有這麼一個機制,在 oc 和 java 中都沒有。參數還有常量參數和變量參數,默認狀況下都是常量參數,在函數體內部是不可以修改的,意思是指傳入一個實參後,把實參的值賦值給了形參,那麼這形參的值是不可以在函數中進行修改的,在 c 中是能夠修改形參的值的,若是須要修改形參的值,那麼須要定義爲變量參數,默認是 let ,使用 var 定義參數就是表示是變量參數,能夠在函數中修改。inout 修飾參數相似於 c 中的指針,參數是值傳遞的,使用 inout 能夠實現引用傳遞,swift 中弱化了指針的概念,儘可能不使用指針,若是要把一個實參傳遞給一個 inout 形參,那麼實參名前要加上&符號,必定要加,可是官方沒有明確聲明這是一個取地址符號(實際就是)。若是定義了一個 inout 參數,那麼就不用也不能在定義是 let 或者 var 參數了。而且 inout 參數不可以傳入常量或者字面量做爲參數值,字面量就是直接寫出來的數值,好比10,20。。。,常量就是 let 常量,由於 inout 的初衷就是用於更改值的,若是傳入不能更改的值沒有任何意義。而且inout 參數不可以定義默認值,不可以是可變參數。inout 參數能夠實現函數的多返回值,好比定義返回類型是元祖類型,比較靈活。


此博客系統沒有自動定時保存草稿的功能,遺失大段內容。。。



遺失部份內容以下:

swift 新加符號 (xxx ??xxx),選並操做符

元祖

json,傳輸格式的一種

數組

.......



字典:字典是無序的,增長字典的鍵值對或者修改鍵值對均可以經過下標進行操做。還有一個 updataValue 的方法來進行更新值,remove 方法來進行鍵值對的移除,這兩個方法都有一個可選的返回值,遍歷字典的方法,建立字典一樣能夠經過構造器來建立,字典中的 key 類型必定要是可哈希的,基本的數據類型都是可哈希的,哈希算法幾乎是不可逆的,MD5的加密算法就是常見的哈希算法之一,哈希是把某個值進行處理,生成獨一無二的一個哈希值,而後經過這個值就能夠快速找到對應的實際值。


控制流,多了 for in ,而且 switch 能夠匹配元祖,而且在 case 中能夠進行「值綁定」,「值綁定」就是把要匹配的值進行傳遞給一個在 case 中定義的變量或者常量(若是要使用 fallthrought,那麼就不能夠在下個 case 中定義變量或者常量),並可使用這個變量或者常量,注意的是默認是局部變量或者常量,只在當前這個 case 語句中生效,若是在 case 中定義了變量或者常量,若是沒有定義 where 語句進行限制的話,那麼編譯時會把 switch 中要匹配的值傳給第一個 case 中定義的變量,還有一個 where 語句能夠進行而外的條件限制,當 where 中的判斷語句爲真時,就匹配當前的 case,並將switch 中的值傳遞給 case 中的變量或者常量。swift 中的全部控制語句都要用大括號。定義標籤,精確控制循環的跳出,格式 lable 循環名:循環語句


二元運算符操做元素的兩邊都要加上空格, control + i, 自動縮進代碼


函數,argument:實參,parameters:形參,在 swift 中函數的參數和返回值是比較靈活的,若是是空形參,那麼小括號也仍是要寫,返回值類型也能夠是可選的。函數中的外部參數名和本地參數名,外部參數名就是一個形參的別名,在調用函數的時候能夠更明確要傳入的參數的做用,只要定義了外部參數名,調用函數時必定要使用外部參數名,還有能夠給形參設置默認值。還可使用#號來修飾參數名,生成一個同名的外部函數名,#也稱爲哈希符號,定義默認的形參值在定義形參的時候定義便可,默認的值能夠覆蓋也能夠省略。函數還有可變參數的特性,即參數的個是不肯定的,可是類型必須是要一致,使用「參數類型...」便可表示一個可變個數的參數類型,這個參數的類型都是一致的,可是個數可變,而且可變參數必定要放在形參列表的最後,即只能定義一個可變參數,最多一個,這個可變參數至關於一個該類型的可變數組,形參名就是數組名。還有  var 參數,函數的形參默認是常量,接收了實參的值後就不能再更改,使用 var 來修飾形參就能夠定義一個可變的形參。還有 inout 參數,這個參數至關於傳入一個指針,可是官方沒有明確代表是傳入了指針,雖然實際就是指針,inout 要配合&符號來使用,&符號用於修飾傳入實參的值,inout 不能有默認值,不能修飾爲 var 或者 let。函數類型,某個函數的類型就是這個函數的形參列表類型+上返回值類型,函數類型 = 每一個形參的類型 + 返回值的類型。在函數類型中,若是爲空形參或者是沒有返回值,都要在對應位置寫上剪頭和小括號,以下: () -> (),若是返回值不爲空,那麼就不要用寫返回值的小括號了,函數類型也是經常使用的類型之一,只要是類型,就能夠定義這個類型的變量或者常量,和普通數據類型同樣使用,把某個類型的數據賦值給一個給類型的數據,好比:let a: Int = 1,換成函數類型就是 let a: 函數類型 = 這個類型的函數名,至關於起了一個函數的別名,又或者能夠更靈活的調用函數,注意=號右邊的函數名以後不要加括號,加上括號就是表示調用函數了,函數類型也能夠省略不寫,由於系統能夠根據=號右邊推斷出變量的類型,函數類型還能夠被當成一種類型在其餘的函數中被使用,就是形參的數據類型同樣,形參的類型也能夠是函數類型,函數類型的主要做用是用於聯繫兩個函數之間的互動,減小函數之間的耦合性,經過類型類進行互動,而不是特定的一個函數名來進行互動,函數類型也能夠是返回值的類型,返回一個函數類型,只是返回這個類型的函數,這個函數中並無參數,至關於對函數進行包裝,簡化函數的使用。swift 中還有全局函數和嵌套函數,通常的都是全局函數,函數中的函數是嵌套函數,嵌套函數對於外部是不可見的,


閉包,又或者能夠稱爲代碼塊,核心的功能就是捕獲,或者抓取一些變量或者常量,函數包括全局函數和嵌套函數都是一種特殊的閉包或者代碼塊。之因此使用閉包是爲了更方便的對常量或者變量進行處理操做,不用在寫函數名或者形參名或者返回值名之類,簡化代碼,注意函數也是閉包的一種,函數名就至關於閉包,當須要傳遞閉包的時候能夠直接傳遞一個函數名,閉包和函數的不一樣就是閉包沒有名字,有形參列表,形參列表寫在大括號內,返回類型也寫在大括號內,而且返回類型以後跟着一個關鍵字 「in」 ,in 以後是閉包的代碼。閉包的做用就是簡化函數的寫法,所以閉包的參數類型是能夠省略的,閉包的返回語句 return 也是能夠在某些狀況下省略的,一樣的閉包中的 -> 返回值類型也是能夠在某種狀況下省略的,而且參數還可以進行簡寫,使用$開頭的就是簡化參數的寫法。掛尾閉包是指,當某個函數須要傳入一個閉包做爲參數時,能夠把閉包當成最後一個形參(若是沒有可變個數的形參),這時候就能夠把這個做爲參數的閉包整個提取出來,寫在這個函數的尾部,也就是寫在函數的形參列表的小括號以後,方便閱讀,若是這個函數只有一個參數,而且這個參數是一個閉包,把這個閉包提取出來掛尾時,這個函數的形參列表的小括號能夠省略不寫.只要在大括號內出現 in,要麼是 for in 循環,要麼這個是個閉包,閉包的值捕獲,在閉包周圍的變量或者常量能夠被這個閉包捕獲,即便閉包所在的函數執行完畢以後,閉包中捕獲的值依然有效,能夠繼續使用,嵌套函數就是閉包的值捕獲的體現,嵌套的函數能夠訪問外部函數的變量,形參等,只要記住閉包就是簡化函數的書寫,就能夠很好理解了,前提之一是這個值是在閉包中使用了的,即被閉包捕獲了的,由於閉包是一種引用類型,因此要注意了,在閉包中被捕獲至關於加了一個強引用,在處理內存時要考慮到這個問題,


重載操做符,操做符也是一個函數,函數也是一個閉包,當須要傳入一個閉包的地方,某些狀況下甚至能夠直接傳入一個操做符就能夠了,大於等於小於加減乘除等等,


枚舉:swift 中的枚舉增長了不少功能,能夠有枚舉的方法,枚舉的屬性,枚舉的協議等等,枚舉能夠搭配 switch 來進行使用,功能強大。枚舉的關聯值,枚舉中還有原始值,在定義枚舉時就能夠定義原始值,定義原始值要同時也要定義枚舉的值類型,定義了一個原始值,這個枚舉屬性以後的值都會自動定義原始值,+1,可使用 toRaw 的方法來查看枚舉變量的原始值是什麼

相關文章
相關標籤/搜索