swift中類和結構體的區別


swift 類和結構體


1:類和結構體定義
類和結構體分別通過關鍵字class 和struct定義。
swift的編碼風格是類class和結構體struct名字使用大寫字母開頭的匈牙利表示法,相反的。類的方法和屬性則用小寫字母開頭的匈牙利表示法。
結構體總是通過被複制而進行代碼傳遞的。

struct SForm{
    var iXX:Int = 99
    var strHello:String = "dsf"
    func testFunc(iXX:Int)->Int{
        return iXX+1
    }
}

class CTset{
    var iAge:Int = 9
    var strName:String = "xx"
    func testFunction(iAge:Int)->Int{
        return iAge+1
    }
    func testFunctionName(strName:String)->String{
        return "oo"+strName
    }
}

2:類和結構體實例

var structObj = SForm()
structObj.iXX = 988
let iRes = structObj.testFunc(4)
let clsObj = CTset()
clsObj.iAge = 987
let iRe:Int = clsObj.testFunction(32)
let iStr:String = clsObj.testFunctionName("sdf")

3:結構體初始化

結構體有一個自動生成的初始化器。新實例中各個屬性的初始值可以通過屬性的名稱傳遞到成員逐一初始化器之中。

var objFirst = SForm(iXX:983, strHello:"hel")
objFirst.iXX = 87
let objSecond = SForm(iXX:94, strHello:"hwxel")
//objSecond.iXX = 876 error

4:結構體是值類型

var objFirst = SForm(iXX:983, strHello:"hel")
var objSecond = objFirst
objSecond.iXX = 5775
println("objFirst: \(objFirst.iXX)  objSecond:\(objSecond.iXX)")
輸出:objFirst: 983  objSecond:5775

5:類是引用類型。


let clsObj = CTset()
clsObj.iAge = 987
var clsObjEx:CTset = clsObj
clsObjEx.iAge = 874
println("\(clsObj.iAge)  \(clsObjEx.iAge)")
輸出:clsObj: 874 clsObjEx: 874

6:類的等價於運算=== 與不等價於 !== 運算 。表示是否是引用到同一個類對象


let clsObj = CTset()
clsObj.iAge = 987
var clsObjEx:CTset = clsObj
clsObjEx.iAge = 874
if clsObj === clsObjEx {
    println("obj same")
}

7:類和結構體區別。結構體是值類型,結構體的賦值意味着拷貝行爲的發生。而類是引用類型。

8:集合類型的賦值和拷貝行爲。

swift的數組和字典都是以值類型傳遞的。

8.1字典的拷貝。當有字典實例的賦值或者是字典做參數的函數調用時候,字典即發生拷貝行爲。字典的key和value的拷貝行爲是依賴於她自身到底是引用屬性還是值類型。

var dicFirst:Dictionary = ["key1":"value1", "key2":"value2"]
var dicSecond:Dictionary = dicFirst
dicSecond["key1"] = "value1Update"
dicSecond的值被更新,而dicFirst的值依然保持不變。dicFirst和dicSecond是兩個獨立的字典。它的key和value在賦值時候發生了拷貝,因爲都是String類型。

class CTset{
    var iAge:Int = 9
    var strName:String = "xx"
    func testFunction(iAge:Int)->Int{
        return iAge+1
    }
    func testFunctionName(strName:String)->String{
        return "oo"+strName
    }
}

var clsObjFirst = CTset()
clsObjFirst.iAge = 443
var dicFirst:Dictionary = ["key1":clsObjFirst]
var dicSecond:Dictionary = dicFirst兩個字典dicFirst 和 dicSecond分別爲不同的字典,但它的值 clsObjFirst的地址卻是同一個。因爲它是類類型,是引用傳遞。

 

8.2數組的賦值與拷貝。數組的拷貝行爲只有在數組的長度發生變化的時候纔會拷貝。當然數組裏面的內容,是要遵循引用類型還是值類型的。

var arrayFirst = [1, 33]
var arraySecond = arrayFirst
arraySecond[0] = 89
//arrayFirst[0]和arraySecond[0] 都會被修改成 89 因爲數組長度沒變化,所以沒發生拷貝

var arrayFirst = [1, 33]
var arraySecond = arrayFirst
arrayFirst.append(222)//長度變化,arrayFirst拷貝,獨立另外一個數組
arrayFirst[0] = 99
println("first:\(arrayFirst)\nsecond:\(arraySecond)")
輸出:
first:[99, 33, 222]
second:[1, 33]

 在用多個變量(var)引用一個數組時候,可以用unshare()方法,強制拷貝數組。


var arrayFirst = [1, 2]
var arraySecond = arrayFirst
var arrayThird = arrayFirst
arraySecond.unshare()//拷貝獨立成另外個數組
arrayThird.unshare()//拷貝獨立成另外個數組
arrayFirst[0] = 3
arraySecond[0] = 4
arrayThird[0]=5
println("first:\(arrayFirst)\nsecond:\(arraySecond) \nthird:\(arrayThird)")
輸出:
first:[3, 2]
second:[4, 2] 
third:[5, 2]

8.3 數組等價於(===)和不等價於(!==) 

 

8.4強制複製數組

通過copy強制複製數組,進行的是數組類容淺拷貝,並返回個新的數組引用。


var arraySource = [1, 2, 3]
var arrayCopy = arraySource.copy()
arraySource[0] = 4
arrayCopy[1] = 5
println("source:\(arraySource)\n copy:\(arrayCopy)")
輸出:
source:[4, 2, 3] 
copy:[1, 5, 3]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章