swift初學總結

自從蘋果公司發佈了新的編程語言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菜鳥中。。。。

待續。。。
相關文章
相關標籤/搜索