最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
22.swift屬性

/*

成都創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注網(wǎng)站制作、成都網(wǎng)站設(shè)計、網(wǎng)站營銷推廣,域名與空間,虛擬空間,網(wǎng)站改版維護有關(guān)企業(yè)網(wǎng)站制作方案、改版、費用等問題,請聯(lián)系成都創(chuàng)新互聯(lián)。

存儲屬性

其實Swift中的存儲屬性就是以前學(xué)習(xí)OC中的普通屬性,在結(jié)構(gòu)體或者類中定義的屬性,默認(rèn)就是存儲屬性

*/

struct Person {

    var name: String

    var age: Int

}

var p:Person = Person(name: "lnj", age: 30)

p.name = "hm"

p.age = 50

/*

常量存儲屬性

常量存儲屬性只能在定義時或構(gòu)造時修改,構(gòu)造好一個對象之后不能對常量存儲屬性進行修改

*/

struct Person2 {

    var name: String

    var age: Int

    let card: String //×××

}

var p2: Person2 = Person2(name: "lnj", age: 30, card: "123456")

p2.name = "hm"

p2.age = 50

//構(gòu)造好對象之后不能修改常量存儲屬性

//p2.card = "56789"

/*

結(jié)構(gòu)體和類常量與存儲屬性的關(guān)系

結(jié)構(gòu)體和枚舉是值類型

類是引用類型

*/

struct Person3 {

    var name: String

    var age: Int

}

let p3: Person3 = Person3(name: "lnj", age: 30)

//因為結(jié)構(gòu)體是值類型,所以不能修改結(jié)構(gòu)體常量中的屬性

//不能修改結(jié)構(gòu)體/枚舉常量對象中的值,因為他指向的對象是一個常量

//p3.name = "hm"

//不能修改結(jié)構(gòu)體常量對象的值

//p3 = Person(name: "hm", age: 50)

class Person4 {

    var name: String = "lnj"

    var age: Int = 30

}

let p4:Person4 = Person4()

//可以修改類常量中的值,因為他指向的對象不是一個常量

p4.name = "hm"

//不可以修改類常量的指向

//p4 = Person4()

/*

延遲存儲屬性

Swift語言中所有的存儲屬性必須有初始值,也就是當(dāng)構(gòu)造完一個對象后,對象中所有的存儲屬性必須有初始值,但是也有例外,其中延遲存儲屬性可以將屬性的初始化推遲到該屬性第一次被調(diào)用的時候

懶加載應(yīng)用場景:

    1.有可能不會用到

    2.依賴于其它值

*/

class Line {

    var start:Double = 0.0

    var end: Double = 0.0

   //如果不是lazy屬性,定義的時候?qū)ο筮€沒有初始化,所以不能訪問self

   // 如果加上lazy, 代表使用時才會加載, 也就是使用到length屬性時才會調(diào)用self,

   //而訪問一個類的屬性必須通過對象方法,所以訪問時對象已經(jīng)初始化完成了,可以使用self

    lazy var length: Double = self.getLenght()

   // 通過閉包懶加載

    lazy var container: Array = {

        print("懶加載")

//        return self.end - self.start

        var arrM = []

        return arrM as [AnyObject]

    }()

    func getLenght() ->Double

    {

        print("懶加載")

        return end - start

    }

}

var line = Line()

line.end = 150.0

//print(line.getLenght())

print("創(chuàng)建對象完畢")

print(line.length)

var arrM = line.container

arrM.append("1")

arrM.append(5)

print(arrM)

/*

計算屬性

1.Swift中的計算屬性不直接存儲值,跟存儲屬性不同,沒有任何的"后端存儲與之對應(yīng)"

2.計算屬性用于計算,可以實現(xiàn)setter和getter這兩種計算方法

3.枚舉不可以有存儲屬性,但是允許有計算屬性

setter 對象.屬性 = 值

getter var value = 對象.屬性

*/

struct Rect {

    var origion: (x: Double, y: Double) = (0, 0)

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

   //由于center的值是通過起點和寬高計算出來的,所以沒有必要提供一個存儲屬性

//    var center: (x: Double, y: Double) = (0, 0)

    var center: (x: Double, y: Double) {

        get{

//            print("get")

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

        }

//        set(newCenter){

        set{

//            print("set \(newCenter)")

           //注意:計算屬性不具備存儲功能,所以不能給計算屬性賦值,如果賦值會發(fā)生運行時錯誤

           // 注意: setter可以自己傳遞一個參數(shù), 也可以使用系統(tǒng)默認(rèn)的參數(shù)newValue

           //如果要使用系統(tǒng)自帶的參數(shù),必須刪除自定義參數(shù)

//            origion.x = newCenter.x - size.w / 2

//            origion.y = newCenter.y - size.h / 2

            origion.x = newValue.x - size.w / 2

            origion.y = newValue.y - size.h / 2

        }

    }

}

var r = Rect()

r.origion = (0, 0)

r.size = (100, 100)

//r.center = ((r.origion.x + r.size.w) / 2, (r.origion.y + r.size.h) / 2)

print("center.x =\(r.center.x) center.y =\(r.center.y)")

r.center = (100, 100)

print("origion.x =\(r.origion.x) origion.y =\(r.origion.y)")

print("center.x =\(r.center.x) center.y =\(r.center.y)")

/*

只讀計算屬性

對應(yīng)OC中的readonly屬性,所謂的只讀屬性就是只提供了getter方法,沒有提供setter方法

*/

class Line2 {

    var start:Double = 0.0

    var end: Double = 0.0

   //只讀屬性,只讀屬性必須是變量var,不能是常量let

   //例如想獲取長度,只能通過計算獲得,而不需要外界設(shè)置,可以設(shè)置為只讀計算屬性

    var length: Double{

       // 只讀屬性的簡寫, 可以省略get{}

//        get{

            return end - start

//        }

    }

}

var line2 = Line2()

line2.end = 100

print(line2.length)

/*

屬性觀察器,類似OC中的KVO,可以用于監(jiān)聽屬性什么時候被修改,只有屬性被修改才會調(diào)用

有兩種屬性觀察器:

1.willSet, 在設(shè)置新值之前調(diào)用

2.didSet, 在設(shè)置新值之后調(diào)用

可以直接為除計算屬性和lazy屬性之外的存儲屬性添加屬性觀察器,但是可以在繼承類中為父類的計算屬性提供屬性觀察器

因為在計算屬性中也可以監(jiān)聽到屬性的改變,所以給計算屬性添加屬性觀察器沒有任何意義

*/

class Line3 {

    var start:Double = 0.0{

        willSet{

            print("willSet newValue =\(newValue)")

        }

        didSet{

            print("didSet oldValue =\(oldValue)")

        }

    }

    var end: Double = 0.0

}

var l = Line3()

l.start = 10.0

/*

類屬性

在結(jié)構(gòu)體和枚舉中用static

在類中使用class,并且類中不允許將存儲屬性設(shè)置為類屬性

*/

struct Person5 {

   //普通的屬性是每個對象一份

    var name: String = "lnj"

   //類屬性是素有對象共用一份

    static var gender:String = "man"

    static var age:Int{

        return 30

    }

    func show()

    {

        print("gender =\(Person5.gender) name =\(name)")

    }

}

var p5 = Person5()

//print("gender = \(p.gender)")

print("gender =\(Person5.gender)")

var p6 = Person5()

//類屬性是所有對象共用一份

print("gender =\(Person5.gender)")

p5.show()

//可以將計算屬性設(shè)置為類屬性

print("age =\(Person5.age)")

class Person6 {

   //普通的屬性是每個對象一份

    var name: String = "lnj"

   //類中不允許將存儲屬性定義為類屬性

//    class var gender:String = "man"

   //類中只能將計算屬性定義為類屬性

    class var age:Int{

        return 30

    }

    func show()

    {

        print("age =\(Person6.age)")

    }

}

var p7 = Person6()

print("age =\(Person6.age)")

p7.show()


文章題目:22.swift屬性
本文來源:http://fisionsoft.com.cn/article/gsodoo.html