天天看點

Swift 結構體和類

/

//swift結構體也具有封裝的概念

//swift結構體比OC C語言裡面的結構體更加進了一步,裡面可以有方法,更接近我們的類

//結構體的定義格式 struct結構體名{成員變量}

struct rect {

    var width:Double //按構造方法賦初值

    var height:Double

    //方法

    func getHeightWidth() -> (x:Double,y:Double)//->傳回類型位元組

    {

        return(width,height)

    }

    func sumHeightWidth() -> (Double)

    {

        return(width+height)

    }

}

//聲明結構體對象 var 變量名:結構體類型=結構體類型(參數)

//swift要求當定義一個結構體對象的時候,必須要對裡面的變量賦一個固定的值

//結構體的構造方法(就是建立了一個結構體對象,首先他要配置設定記憶體空間(這一步由系統自行幫我們完成),配置設定完記憶體就會立即調用我們的初始化方法(構造方法)來對變量賦初值)

//swift的結構體初始化方法有兩種 一種是成員逐一構造器var rect1:rect=rect(width: 100, height: 100) 一種是系統預設的不帶任何參數的初始化方法struct rect {

//var width:Double=0.0 //按構造方法賦初值

//var height:Double=0.0

//}

//var rect1:rect=rect()

var rect1:rect=rect(width: 100, height: 100)

println("\(rect1.width),\(rect1.height)")

//調用

var c_n=rect1.getHeightWidth()

println(c_n)

var w_h=rect1.sumHeightWidth()

println(w_h)

//結構體的整體指派

var rect3 = rect1

//整體指派後的可能性有兩種(1)rect3與rect1指向同一個記憶體空間(2)rect3與rect1内容一樣,記憶體空間不一樣

//驗證方法有兩種可以直接列印記憶體位址還有一種是改變值如果指向統一記憶體空間則指派後的也應該改變成一樣

rect1.width = 20

println(rect1.width)

println(rect3.width)

//值未變可以知道是第二種 即指派後内容一樣,記憶體空間不一樣

//類與結構體在定義的格式上沒有太大的差別,類在建立的時候必須要給裡面的變量附一個初始值,因為類與結構體不一樣,它沒有成員逐一構造器

class rectww {

    var width:Double=0.0

    var height:Double=0.0

}

var re:rectww=rectww()

println("\(re.width),\(re.height)")

//類的整體指派

//指向同一記憶體空空間

var ss = re

re.width = 200

println(re.width)

println(ss.width)

//===恒等 !==不等 隻能用類

if ss===re{

    println("同一個類")

}

else

{

    println("不同")

}

//存儲屬性

//常量存儲屬性 :隻能在構造對象的時候改變值之後不被允許改變

//延遲存儲屬性

//結構體常量和類常量與存儲屬性的關系

//結構體常量常量對象,本身是一個常量,對應的屬性不可以通過修改它改變

struct person{

    let name:NSString = "張三"//常量

    var age:Int = 10//變量

}

let per:person=person(name: "李四", age: 20)//在構造對象的時候可以改變值之後不被允許改變 例如會報錯//per.name = "王五" //per.age = 39

println(per.name)

//類本身是一個常量,屬性可以通過修改它改變

class person1{

    let name1:NSString = "張三"//常量

    var age1:Int = 10//變量

}

let per1:person1=person1()//在構造對象的時候可以改變值之後不被允許改變 例如會報錯

//per1.name1 = "王五"

per1.age1 = 39

println(per1.name1)

//延遲存儲屬性

struct student {

    var name:String

    var chinese:Double

    var math:Double

    func showMyStudent(){

        println("姓名:\(name),國文成績:\(chinese),數學成績:\(math)")

    }

}

class myClass {

    var array:[student]=[]

    lazy var score :Double = self.getScore()//延遲

    func getScore()->Double{

        println("888888")

        var t:Double = 0

        for i in array

        {

            t+=i.chinese

            t+=i.math

        }

        if array.count == 0

        {

            return 0

        }

        else

        {

            //swif裡面隻有隐式類型推斷,沒有隐式類型轉換

            return t/Double (array.count)

        }

    }

    func show(){

        for i in array

        {

            i.showMyStudent()//直接調用方法

        }

    }

}

let stu1 = student(name: "張三", chinese: 100, math: 100)

let stu2 = student(name: "李四", chinese: 100, math: 100)

//建立類的對象

let c0 = myClass()

c0.array.append(stu1)//加到數組

c0.array.append(stu2)

c0.show()

println(c0.getScore())

println("********")

//計算屬性

struct myRect {

    var origin:(x:Double,y:Double)=(0,0)//坐标

    var size:(w:Double,h:Double)=(10,10)

    var center:(x:Double,y:Double)//中心點

        {

            //getter方法 當隻有getter方法為隻讀 可以簡寫為一句return (origin.x+size.w/2,origin.y+size.h/2)

            get{

                return (origin.x+size.w/2,origin.y+size.h/2)

            }

           //setter方法

            set(n){

                //當sette沒有傳遞參數時用newValue來代替n

                 origin.x=n.x-size.w/2

                 origin.y=n.y-size.h/2

            }

    }

}

var rect4 = myRect()

rect4.size=(100,100)

rect4.origin=(10,10)

//rect4.center=(rect4.origin.x+rect4.size.w/2,rect4.origin.y+rect4.size.h/2)

println(rect4.center)

//屬性觀察器

//用于觀察屬性變化,是指屬性的值被修改時可以調用我們事先寫好的一些代碼段 類似oc中的kvo

//swift存在兩種屬性觀察器

//1.willset 在設定新值的時候被調用的

//2.didset 在新值設定之後被調用

//不可以給延遲屬性添加觀察器 其他的都可以

class rr {

    var a:String="nihao"{

        willSet{

            println("willSet,改變之前的值:\(a)")

            println(newValue)

        }

        didSet{

            println("didSet,改變之後的值:\(a)")

            println(oldValue)

        }

    }

}

//改變值 先建立類的對象

var ass=rr()

ass.a="hehe"

//總結 結構體為值傳遞 類為引用

轉載于:https://www.cnblogs.com/wusang/p/4717570.html