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]

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM