12.Swift 類的介紹和定義

@(〓〓 iOS-Swift語法)[Swift 語法]


iOS Swift 語法 底層原理內存管理分析 專題:【iOS Swift5語法】

00 - 匯編
01 - 基礎語法
02 - 流程控制
03 - 函數
04 - 枚舉
05 - 可選項
06 - 結構體和類
07 - 閉包
08 - 屬性
09 - 方法
10 - 下標
11 - 繼承
12 - 初始化器init
13 - 可選項


目錄

  • 12.Swift 類的定義
  • 主要內容
  • 一. 類的介紹和定義
  • 二. 如何定義類的屬性
    • 類的屬性介紹
    • 存儲屬性
    • 計算屬性
    • 類屬性
    • 監聽屬性的改變

主要內容

  • 類的介紹和定義
  • 類的屬性
  • 類的構造函數

一. 類的介紹和定義

  • Swift也是一門面向對象開發的語言
  • 面向對象的基礎是類,類產生了對象
  • 在Swift中如何定義類呢?
    • class是Swift中的關鍵字,用于定義類
class 類名 : SuperClass {
    // 定義屬性和方法
}
  • 注意:
    • 定義的類,可以沒有父類.那么該類是rootClass
    • 通常情況下,定義類時.繼承自NSObject(非OC的NSObject)

二. 如何定義類的屬性


類的屬性介紹

  • Swift中類的屬性有多種

    • 存儲屬性: 存儲實例的常量和變量
    • 計算屬性: 通過某種方式計算出來的屬性
    • 類屬性: 與整個類自身相關的屬性
  • 使用Student類介紹存儲屬性,計算屬性,類屬性.

// ----------------------------------------------------------------------------
// 1.類的定義
class Student : NSObject {
    
    // 屬性
    
    // ------------------------------------------------------------------------
    // 1.1 存儲屬性
    // 如果是結構體類型/對象類型通常聲明為可選類型
    // 如果是基本數據類型,通常情況下賦值一個初始值
    var name : String?
    var phoneNum : String?
    var age : Int = 0
    
    var mathScore : Double = 0.0
    var chineseScore : Double = 0.0
    
    // ------------------------------------------------------------------------
    // 1.2 計算屬性
    var averageScore : Double {
        // 可以省略get
//        get {
//            return (mathScore + chineseScore) * 0.5
//        }
        
        // 省略get的寫法
        return (mathScore + chineseScore) * 0.5

        
        /*
        set {   // newValue是系統默認生成的變量,內部存儲著設置計算屬性的值.其實使用該方式設置并沒有作用,因為get中返回的還是計算的值
            self.averageScore = newValue
        }
        */
        
    }
    // ------------------------------------------------------------------------
    // 1.3 用static定義類屬性
    static var courseCount : Int = 0
}

// ----------------------------------------------------------------------------
// 1.創建對象
let stu = Student()

// 2.給存儲屬性賦值
stu.name = "liwx"
stu.phoneNum = "+86 110"
stu.age = 18
stu.mathScore = 99
stu.chineseScore = 89

// 3.獲取計算屬性的值
print(stu.averageScore)

// 擴充: 使用此方式賦值,計算屬性內部需寫set {}
//stu.averageScore = 10

Student.courseCount = 2
print(Student.courseCount)


// 可選綁定
if let tempName = stu.name {
    print(tempName)
}




存儲屬性

  • 存儲屬性是最簡單的屬性,它作為類實例的一部分,用于存儲常量和變量.
  • 可以給存儲屬性提供一個默認值,也可以在初始化方法中對其進行初始化
  • 下面是存儲屬性的寫法
    • age和name都是存儲屬性,用來記錄該學生的年齡和姓名
    • chineseScore和mathScore也是存儲屬性,用來記錄該學生的語文分數和數學分數
// ------------------------------------------------------------------------
    // 1.1 存儲屬性
    // 如果是結構體類型/對象類型通常聲明為可選類型
    // 如果是基本數據類型,通常情況下賦值一個初始值
    var name : String?
    var phoneNum : String?
    var age : Int = 0
    
    var mathScore : Double = 0.0
    var chineseScore : Double = 0.0

計算屬性

  • 計算屬性并不存儲實際的值,而是提供一個getter和一個可選的setter來間接獲取和設置其它屬性.
  • 存儲屬性一般只提供getter方法/
  • 如果只提供getter,而不提供setter,則該計算屬性為只讀屬性,并且可以省略get{}
  • 下面是計算屬性的寫法
    • averageScore是計算屬性,通過chineseScore和mathScore計算而來的屬性
    • 在setter方法中有一個newValue變量,是系統指定分配的
 // ------------------------------------------------------------------------
    // 1.2 計算屬性
    var averageScore : Double {
        // 可以省略get
//        get {
//            return (mathScore + chineseScore) * 0.5
//        }
        
        // 省略get的寫法
        return (mathScore + chineseScore) * 0.5

        
        /*
        set {   // newValue是系統默認生成的變量,內部存儲著設置計算屬性的值.其實使用該方式設置并沒有作用,因為get中返回的還是計算的值
            self.averageScore = newValue
        }
        */

類屬性

  • 類屬性是與類相關聯的,而不是與類的實例相關聯
  • 所有的類和實例都共有一份類屬性.因此在某一處修改之后,該類屬性就會被修改.
  • 類屬性的設置和修改,需要通過類來完成
  • 下面是類屬性的寫法
    • 類屬性使用static來修飾
    • courseCount是類屬性,用來記錄學生有多少門課程
// ------------------------------------------------------------------------
    // 1.3 用static定義類屬性
    static var courseCount : Int = 0

監聽屬性的改變

  • OC中我們可以重寫set方法來監聽屬性的改變

  • Swift中可以通過屬性觀察者來監聽和響應屬性值的變化.

  • 通常是監聽存儲屬性和類屬性的改變.(對于計算屬性,我們不需要定義屬性觀察者,因為我們可以在計算屬性的setter中直接觀察并響應這種值的變化)

  • 我們通過設置以下觀察方法來定義觀察者

    • willSet:在屬性值被存儲之前設置。此時新屬性值作為一個常量參數被傳入。該參數名默認為newValue,我們可以自己定義該參數名
    • didSet:在新屬性值被存儲后立即調用。與willSet相同,此時傳入的是屬性的舊值,默認參數名為oldValue
    • willSet與didSet只有在屬性第一次被設置時或屬性重新被設置是才會調用,在初始化時,不會去調用這些監聽方法
  • 監聽的方式如下:

    • 監聽age和name的變化

// ----------------------------------------------------------------------------
// 1.屬性監聽器
// 1.1 定義學生類
class Student : NSObject {
    var name : String?
    var age : Int = 0
}

let stu1 = Student()
stu1.name = "liwx"
stu1.age = 18

// ------------------------------------------------------------------------
// 1.2 定義繼承UITableViewCell的類
class MyCell : UITableViewCell {
    
    // Swift中沒有set方法和get方法,有屬性監聽器
    // 屬性監聽是通過某種方式監聽屬性的改變
    
    // 1.定義一個模型屬性,設置屬性監聽器,在{}中對屬性進行操作,
    var stu : Student? {
        
        // willSet: 屬性即將發生改變.此時屬性值還是舊值
        // 在willSet中有一個系統生成的臨時變量newValue,用于存儲新值
        // 可以給newValue自定義名稱: willSet(new)
        willSet {
            print(stu)
            
            print(newValue)
        }
        
        // didSet: 屬性已經發生改變,此時屬性值是新值
        // 在didSet中有一個系統生成的臨時變量oldValue,用于存儲舊值
        // 可以給newValue自定義名稱: willSet(old)
        // 一般屬性被修改在didSet中設置即可
        didSet {
            print(stu)
            print(stu?.name)
            print((stu?.age)!)
            
            print(oldValue)
        }
    }
}

// 在賦值時,監聽該屬性的改變
// 在OC中是通過重寫set方法
// 在Swift中,可以給屬性添加監聽器
let myCell = MyCell()
myCell.stu = stu1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容