自從蘋果公司發佈了新的編程語言swift,讓我提起了更大的興趣,初看swift的文檔,發現swift與JavaScript語言的有點類似,有點相似腳本語言了。java
支持swift開發的ide爲xcode 6 beta 編程
剛開始學,隨便寫寫吧swift
swift函數:swift函數能夠存在在struct結構體裏,也能夠存在在calss裏,還能夠獨立的寫,不依附與具體的結構體和類
xcode
(這一點有點像oracle中定義函數的意思,能夠依附於type,也能夠獨立的function)閉包
聲明一個函數:oracle
func someFunction(args: Int,outArgs b:Double,#inout:String,ifchonse a: String = "你好") -> Int{ //此處定義了有四個參數的一個函數,返回值是一個Int類型,四種不一樣的參數寫法, //args參數,類型爲Int類型,這個參數的名是內部參數明,固然也能夠用做外部參數名,若是隻含有一個參數名的 println(args) //outArgs b 參數,類型爲Double類型,outArgs爲外部參數名,b爲內部參數名,調用這個函數時能夠這樣調用 //someFunction(3,outArgs : 2.5,inout: "你是誰"),在內部使用第二個參數時,參數名爲b println(b) //參數名前加#號,能夠看成內部外部參數,最後一個參數是無關緊要的,沒有傳遞最後一個參數時,最後一個參數默認爲 「你好」 return 33 }
函數類型:一個函數能夠看做一個類型,for example編程語言
func add(a: Int, b: Int) -> Int{ return a+b } func reduce(a:Int, b: Int) -> Int{ return a-b } //以上這兩個函數的格式都是(Int,Int) -> Int ,因此這兩個函數都有一個相同的類型,函數類型也是一種類型,因此能夠有更多地靈活用法 var ownFunction:(Int, Int) -> Int //聲明一個函數類型的變量 if condition { ownFunction = add //給函數類型的變量賦值 }else{ ownFunction = sub } let result = ownFunction(3,5) //執行函數的 函數還能夠看成參數,也能夠看成返回值 func addAge(age: Int, age2: Int) -> Int{ return age+Int(age2) } func hasFuncArgsFunction(a:Bool, #callback:(Int,Double) -> Int) -> (Int,String) ->Int{ if a { let result = callback(3,3.5) return func reFunc(age:Int, name:String) -> Int{ return age+result } }else{ return func reFunc(age: Int, name:String) -> Int{ return age } } } //調用上面的函數 var resultFunction = hasFuncArgsFunction(a:true,callback:addAge) //這裏會獲得一個函數,函數最後返回的是一個Int值 var overResult = resultFunction(age: 55,name: "小飛") //這裏貌似還有一個閉包,內部返回函數,引用到了hasFuncArgsFunction函數裏面的一個常量,swfit這麼靈活的的函數//方式,估計之後會有不少複雜的函數問題,函數中能夠返回函數,返回的函數還能夠返回函數,還好返回類型肯定了,要是//跟js同樣返回值不肯定會是什麼,那樣極可能形成運行。看了幾天,swift並非若類型語言,而是很強的強類型語言,起//碼比java類型約束強
swift內存管理機制方式,也許是借鑑的javaScript引用計數,但回收機制卻不同,js回收是利用gc來在不按期間回收內存中引用數爲0的內存對象,swift在引用計數爲0時,會馬上把該對象在內存內移除,而曾經在js中引發內存泄露的循環引用問題,在swift語言中採用弱引用也很好的獲得瞭解決,寫個例子ide
class Dog{ var host: Person? } class Person{ var hony: Dog? func getDog(dog:Dog){ hony = dog dog.host = self } } //可選屬性,能夠不初始化屬性 var person = Person() //Person被 person引用,計數++ var dog = Dog() //Dog被 dog引用,計數++ //因爲對象類型是按引用傳遞的,這裏host會引用到Person,hony會引用到Dog,這種引用是一種強引用,會形成這兩個對象的引用計數+1 person.getDog(dog:dog) //當運行完該程序,person,dog再也不指向內存中的Person對象和Dog對象,然而兩個內存中的對象的引用計數不是0 //這樣這兩個對象會一直會存在在內存中,直到整個程序退出,這樣會形成內存泄露 弱引用:一種能夠不用增長對象的引用計數的方式 cLass Dog{ weak var host: Person? } class Person{ weak var dog: Dog? func getDog(dog: Dog){ dog = dog dog.host = self } } //採用關鍵字weak,可讓引用變成弱引用,引用計數不會+1,當Person的引用計數變爲0時,Dog的host會被賦值爲nil //,所以弱引用必須爲可選值, 誤導了請諒解,swift菜鳥中。。。。 待續。。。