iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

儲存屬性

儲存屬性用於定義class或是struct的某些特性,儲存屬性就是用變數或是常數儲存的有意義的值。

class student {
    // 定義姓名和年齡
    var name: String
    var age: Int
    // 提供一個構造方法
    init(name: String, age: Int, sex: String) {
        self.name = name
        self.age = age
        self.sex = sex
    }
}

在class中有個原則,是class被構造完成時,必須保證所有的屬性或是初始化完成,因此,一般情況下開發者會在建立的class中提供一個構造方式用來設置其中的屬性,也可以在宣告時就提供一個初始值。

class student {
    // 定義姓名和年齡
    var name: String
    var age: Int
    // 定義性別常數
    let sex: String
    // 提供一個構造方法
    init(name: String, age: Int, sex: String) {
        self.name = name
        self.age = age
        self.sex = sex
    }
}

透夠點語法調用其屬性,需要注意的是,變數的屬性可以進行修改,常數的則不能修改,但是對於值類型,如果是常數接收,那不能進行修改,但假設是引用類型的,則都可以修改。

let point = Point(x: 2, y: 1)
// 會報錯
point.x = 3
// 這個則不會報錯
let point2 = PointC(x: 2, y: 2)
point2.y = 5

有關於儲存屬性,還有一個特性,Swift中可以將儲存屬性設置為儲存屬性。所謂延時屬性,是指類在實例構造的時候,並不會進行構造或是初始化,只有當開發者調用這個屬性時,此屬性才會構造或是初始化。

class Work {
    var name: String
    init(name: String) {
        self.name = name
        print("finish")
    }
}
class People {
    var age: Int
    lazy var work: Work = Work(name: "teacher")
    init(age: Int) {
        self.age = age
    }
}
// 構造People時沒有印出Word類的資訊
var people = People(age: 24)
// 使用work屬性才完成對Work的構造
print(people.work)
巧妙使用lazy屬性會提升程式碼的效能。

計算屬性

與儲存屬性相比,計算屬性更像是一個計算過程,用來描述這種可以由其他屬性透過計算而得到的屬性。

class Circle {
    // 提供兩個儲存屬性
    var r: Double
    var center: (Double,Double)
    // 提供周長面積計算屬性
    var l: Double{
        get{
            return 2 * r * Double.pi
        }
        set{
            r = newValue / 2 / Double.pi
        }
    }
    
    var s: Double{
        get{
            return 2 * r * Double.pi
        }
        set{
            r = sqrt(newValue / Double.pi)
        }
    }
    init(r: Double, center: (Double,Double)) {
        self.r = r
        self.center = center
    }
}
// 建立圓實例
var circle = Circle(r: 3, center: (3,3))
// 透過計算得到數值
print("(circle.l), (circle.s)")
// 透過周長和面積來設置圓的半徑
circle.l = 12 * Double.pi
print(circle.r)
circle.s = 25 * Double.pi
print(circle.r)

在計算過程中,通常會用到其他的儲存屬性,需要在計算屬性的set方法中,會將外界所設置的值默認為以newValue傳入。

class Circle {
    // 提供兩個儲存屬性
    var r: Double
    var center: (Double,Double)
    // 提供周長面積計算屬性
    var l: Double{
        get{
            return 2 * r * Double.pi
        }
        set{
            r = newValue / 2 / Double.pi
        }
    }
    
    var s: Double{
        get{
            return 2 * r * Double.pi
        }
        // 自定義傳值名稱
        set(newValue){
            r = sqrt(newValue / Double.pi)
        }
    }
    init(r: Double, center: (Double,Double)) {
        self.r = r
        self.center = center
    }
}

關於計算屬性get與set方法,get方法是必不可少的,而set則是可選的,當一個計算屬性只有get沒有set的時候,此計算屬性是只讀的。

class TestClass {
    var test: Int {
        get{
            return 10
        }
    }
}
var test = TestClass()
// 對只讀的屬性會報錯
test.test = 10

可以簡寫成這樣

class TestClass {
    var test: Int{
        return  10
    }
}

接下來,是屬性監聽器與包裝器的介紹


上一篇
Day18 Swift 類
下一篇
Day20 Swift 屬性Property observers
系列文
初入Swift新手村的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言