最近在IMOOK(網站)上自學了下swift , 總結下swift相對其餘語言的不一樣之處 , 方便熟悉其餘語言的程序員,熟悉swift語言的特性.java
1. swift 的特別之處就是能夠在原有的類上 , 使用 protocol (相似java接口) 得到泛型的做用 . ios
2. 經過extension能夠擴展普通的class, struct, 也能夠擴展protocol, 使用protocol類都擁有公共的擴展.程序員
1 protocol Readable { 2 3 var programLang:String 4 5 var programeSourceUrl:String 6 7 var maxExecuteSecounds:Long 8 9 } 10 11 protocol Execuable { 12 func execute() 13 } 14 15 16 17 class BrowserScript : Readable { 18 19 var progameLang:String = "js" 20 var programeSourceUrl:String = "http://xxxx.com/adfd.js" 21 var maxExecuteSecounds:Long=20
23 init() { 24 println("browser script init") 25 } 26 27 28 execute 29 30 } 31 32 extenstion BrowserScript:Executable { 33 execute() { 34 JavaCoreScript.run(programeSourceUrl); 35 } 36 } 37 38 39 //test: 40 41 func executeTask<T:Executable>(executor:T) { 42 executor.execute(); 43 } 44 45 46 executeTask(BrowserScript()); //不會報錯 47 48 49
經過協議再不修改BrowserScript類定義文件的前提下, 爲BrowserScript增長了execute的能力.
extenstion 能夠用在ios內置,各類庫,本身編寫的任意類,函數體,Enum,由於基本數據類型實際是結構體,因此也能夠extension功能.swift
在swift官方的實現中大量使用extension實現功能,swift是面向協議擴展的語言.閉包
3. swift的問號函數
swift 問號相似 var card:String? ,有問號表示這個變量能夠爲空(nil),實際也是Optional枚舉類型,有值時候用Optional.Some()包裝,使用時候須要解包,若是爲nil實際爲Optional.None().網站
解包的方法就是spa
if let card = card { println("your card is ",card); }
4. Int,Long,String,Dictionary,Array 其實都是結構體,struct.code
結構體和類的區別就是,結構體傳值都是內存拷貝, 類引用通常都是引用.對象
5. weak 關鍵字.
weak 關鍵字表示弱引用, 就是擁有這個weak變量的對象不持有這個變量的引用.引用計數是內存回收的一種方法,爲0時系統負責回收內存,若是對象A包含屬性B強引用屬性,直接a=nil, B 不會回收. 若是屬性B設置爲弱引用,自己設置屬性b, b的引用計數不增加. weak用在此屬性能夠爲空的狀況.
6.unowned 關鍵字.
unowned 至關於weak,不過這個屬性不能爲空.屬性被設置爲空,程序崩潰直接退出.因此不多用.
7. 函數/方法.
7.1 方法定義:
func method1(_ x1:Int,_ x2 :Int) ->Int { //do something }
var sum = method1(1,2);
上面的參數中的下劃線是外參數名 ,位置在形參x1前面 ,若是是下劃線,表示調用時候不用寫外參名稱.若是是有名字,調用時候須要寫外參數名,加入第二個參數的下劃線替換成num2,調用時須要寫成:
var sum2 = method1(1,num2:2);
最後的->表示以後跟着的是返回值 ,返回值能夠是一個值,也能夠是函數(方法).
方法能夠直接寫閉包(匿名函數) .
舉例: 學生報名到學校, 返回流程處理函數, 具體就是執行了發送短信叫家長交學費. 返回的函數參數是家長的相關聯繫方式.
func add(student:Student,to school:School) ->(String)->{sendMsgToParentsFee($0);}
上面的返回值是最後那個參數是String類型,具體執行是{}包含着的函數.裏面的$0 表示參數中的第一個參數,多個參數依次累加表示.
調用 :
x.add(student:studentObj,to:schoolObj)