@(〓〓 iOS-Swift語法)[Swift 語法]
- 作者: Liwx
- 郵箱: 1032282633@qq.com
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