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:類和結構體實例swift
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:結構體初始化數組
結構體有一個自動生成的初始化器。新實例中各個屬性的初始值能夠經過屬性的名稱傳遞到成員逐一初始化器之中。app
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:類的等價於運算=== 與不等價於 !== 運算 。表示是不是引用到同一個類對象spa
let clsObj = CTset() clsObj.iAge = 987 var clsObjEx:CTset = clsObj clsObjEx.iAge = 874 if clsObj === clsObjEx { println("obj same") }
7:類和結構體區別。結構體是值類型,結構體的賦值意味着拷貝行爲的發生。而類是引用類型。code
8:集合類型的賦值和拷貝行爲。orm
swift的數組和字典都是以值類型傳遞的。對象
8.1字典的拷貝。當有字典實例的賦值或者是字典作參數的函數調用時候,字典即發生拷貝行爲。字典的key和value的拷貝行爲是依賴於她自身究竟是引用屬性仍是值類型。blog
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]