swift學習第十二天:類的屬性定義


類的屬性介紹
  • Swift中類的屬性有多種
    • 存儲屬性:存儲實例的常量和變量
    • 計算屬性:通過某種方式計算出來的屬性
    • 類屬性:與整個類自身相關的屬性
存儲屬性
  • 存儲屬性是最簡單的屬性,它作為類實例的一部分,用於存儲常量和變量
  • 可以給存儲屬性提供一個默認值,也可以在初始化方法中對其進行初始化,而且必須得有默認值,否則會報錯
  • 下面是存儲屬性的寫法
    • age和name都是存儲屬性,用來記錄該學生的年齡和姓名
    • chineseScore和mathScore也是存儲屬性,用來記錄該學生的語文分數和數學分數
class Student : NSObject { // 定義屬性 // 存儲屬性 var age : Int = 0 var name : String? var chineseScore : Double = 0.0 var mathScore : Double = 0.0 } // 創建學生對象 let stu = Student() // 給存儲屬性賦值 stu.age = 10 stu.name = "why" stu.chineseScore = 89.0 stu.mathScore = 98.0 
計算屬性
  • 計算屬性並不存儲實際的值,而是提供一個getter和一個可選的setter來間接獲取和設置其它屬性
  • 計算屬性一般只提供getter方法
  • 如果只提供getter,而不提供setter,則該計算屬性為只讀屬性,並且可以省略get{}
  • 下面是計算屬性的寫法
    • averageScore是計算屬性,通過chineseScore和mathScore計算而來的屬性
    • 在setter方法中有一個newValue變量,是系統指定分配的
class Student : NSObject { // 定義屬性 // 存儲屬性 var age : Int = 0 var name : String? var chineseScore : Double = 0.0 var mathScore : Double = 0.0 // 計算屬性 var averageScore : Double { get { return (chineseScore + mathScore) / 2 } // 沒有意義,因為之后獲取值時依然是計算得到的 // newValue是系統分配的變量名,內部存儲着新值 set { self.averageScore = newValue } } } // 獲取計算屬性的值 print(stu.averageScore) 
類屬性
  • 類屬性是與類相關聯的,而不是與類的實例相關聯
  • 所有的類和實例都共有一份類屬性.因此在某一處修改之后,該類屬性就會被修改
  • 類屬性的設置和修改,需要通過類來完成
  • 下面是類屬性的寫法
    • 類屬性使用static來修飾
    • courseCount是類屬性,用來記錄學生有多少門課程
class Student : NSObject { // 定義屬性 // 存儲屬性 var age : Int = 0 var name : String? var chineseScore : Double = 0.0 var mathScore : Double = 0.0 // 計算屬性 var averageScore : Double { get { return (chineseScore + mathScore) / 2 } // 沒有意義.newValue是系統分配的變量名,內部存儲着新值 set { self.averageScore = newValue } } // 類屬性 static var corseCount : Int = 0 } // 設置類屬性的值 Student.corseCount = 3 // 取出類屬性的值 print(Student.corseCount) 
監聽屬性的改變
  • 在OC中我們可以重寫set方法來監聽屬性的改變
  • Swift中可以通過屬性觀察者來監聽和響應屬性值的變化
  • 通常是監聽存儲屬性和類屬性的改變.(對於計算屬性,我們不需要定義屬性觀察者,因為我們可以在計算屬性的setter中直接觀察並響應這種值的變化)
  • 我們通過設置以下觀察方法來定義觀察者
    • willSet:在屬性值被存儲之前設置。此時新屬性值作為一個常量參數被傳入。該參數名默認為newValue,我們可以自己定義該參數名
    • didSet:在新屬性值被存儲后立即調用。與willSet相同,此時傳入的是屬性的舊值,默認參數名為oldValue
    • willSet與didSet只有在屬性第一次被設置時才會調用,在初始化時,不會去調用這些監聽方法
  • 監聽的方式如下:
    • 監聽age和name的變化
class Person : NSObject { var name : String? { // 可以給newValue自定義名稱 willSet (new){ // 屬性即將改變,還未改變時會調用的方法 // 在該方法中有一個默認的系統屬性newValue,用於存儲新值 print(name) print(new) } // 可以給oldValue自定義名稱 didSet (old) { // 屬性值已經改變了,會調用的方法 // 在該方法中有一個默認的系統屬性oldValue,用於存儲舊值 print(name) print(old) } } var age : Int = 0 var height : Double = 0.0 } let p : Person = Person() // 在賦值時,監聽該屬性的改變 // 在OC中是通過重寫set方法 // 在swift中,可以給屬性添加監聽器 p.name = "why" //p.name = "yz"


import UIKit

class Student: NSObject {
    // 定義屬性
    // 定義存儲屬性
    var age : Int = 0
    var name : String?
    
    var mathScore : Double = 0.0
    var chineseScore : Double = 0.0
    
    // 定義計算屬性: 通過別的方式計算到結果的屬性,稱之為計算屬性
    var averageScore : Double {
        return (mathScore + chineseScore) * 0.5
    }
    
    // 定義類屬性: 類屬性是和整個類相關的屬性.而且是通過類名進行訪問
    static var courseCount : Int = 0
    
    /*
    // 定義方法,可以返回平均成績
    func getAverageScore() -> Double {
        // 在swift開發中,如果使用當前對象的某一個屬性,或者調用當前對象的某一個方法時,可以直接使用,不需要加self
        return (mathScore + chineseScore) * 0.5
    }
    */
}

// 給類屬性進行賦值
Student.courseCount = 2

// 創建對象
let stu = Student()

// 給對象的屬性賦值
stu.age = 10
stu.name = "yz"
stu.mathScore = 78
stu.chineseScore = 59.9

print(stu.age)
if let name = stu.name {
    print(name)
}

let averageScore = stu.averageScore

 


免責聲明!

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



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