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]