類介紹
- Swift雖然推薦面向協定程式設計,但其也是一門面向對象開發的語言
- 面向對象的基礎是類,類産生了對象(類的執行個體)
- Swift中用
關鍵字定義類class
定義文法
class 類名 {
// 定義屬性和方法
}
- 舉例
class Person {
var name = "Zhangsan"
var age = 10
var sex = "man"
func say(){
print("人會說話")
}
}
- 解讀
- 定義了一個名叫 Person的類
- 這個類有三個變量存儲屬性和一個方法
類的執行個體
- 結構體一樣,最簡單的是在名稱後面加一個
,但預設沒有成員構造函數()
var p1 = Person()
通路屬性和方法
- 可以用
來通路一個執行個體的屬性和方法.
- 通路時如果使用了指派語句就是設定屬性
//普通構造函數
var p1 = Person()
//通路
p1.age
//設定
p1.age = 30
p1.name
p1.sex
p1.say()
類是引用類型
- 不同于值類型,引用類型被指派到一個常量,變量或者本身被傳遞到一個函數的時候它是不會被拷貝的,而使用的是同一個對某個執行個體的引用。
var p2 = p1
p2.name = "Lisi"
p2.age = 20
p2.sex = "woman"
//對p2的修改會影響原來的p1
p1.age
p1.name
p1.sex
特征運算符
- 因為類是引用類型,可能有很多常量和變量都是引用到了同一個類的執行個體。有時候需要找出兩個常量或者變量是否引用自同一個執行個體,Swift提供了兩個特征運算符來檢查兩個常量或者變量是否引用相同的執行個體。
- 相同于 ( ===)
- 不同于( !==)
//特征運算符
let p3 = Person()
p1 === p2 //true
p1 === p3 //false
p1 !== p3 //true
繼承
- 一個類可以從另一個類繼承方法、屬性和其他的特性
- 當一個類從另一個類繼承的時,繼承的類就是子類,被繼承的就是父類
- 繼承的目的是為了代碼複用
Do Not Repeat Yourself
- 案例
// 定義一個父類
class Vehicle {
var currentSpeed = 0.0
func makeNoise() {
print("Ba Ba")
}
}
// 定義一個子類
class Bicycle: Vehicle {
var hasBasket = false
}
// 定義一個子類
class Car: Vehicle {
var banner = "皖B12345"
}
var vehicle = Vehicle()
vehicle.makeNoise()
let bicycle = Bicycle()
bicycle.makeNoise()
var car = Car()
car.makeNoise()
重寫(覆寫)
- 所謂重寫就是子類可以對繼承自父類執行個體方法、類型方法、執行個體屬性,類型屬性進行覆寫
- 重寫需要在前面加上
關鍵字override
- override 關鍵字執行時Swift 編譯器會檢查重寫的類的父類(或者父類的父類)是否有與之比對的聲明來提供重寫
class Car: Vehicle {
var banner = "皖B12345"
override func makeNoise() {
print("Di Di")
}
}
var car = Car()
car.makeNoise()
- 防止被重寫
- 可以通過
标記阻止這種行為:final
final var , final func , final class func
- 可以通過
class Vehicle {
var currentSpeed = 0.0
func makeNoise() {
print("Ba Ba")
}
//不能被子類重寫
final func run() {
print("Run Run")
}
}
類與結構體的對比
- 相同點
- 定義屬性
- 定義方法
- 定義構造函數(init函數)
- 可以被擴充
- 遵循協定
- 類有而結構體沒有的額外功能
- 類型轉換(子類 as 父類)
- 析構函數
- 引用計數
開發中類與結構體的使用場景
- 類和結構體都可以用來定義自定義的資料類型,結構體執行個體總是通過值來傳遞,而類執行個體總是通過引用來傳遞。
- 按照通用準則,當符合以下一條或多條情形時應考慮結構體,其他情況下,使用類。大部分的自定義的資料結構應該是類,而不是結構體。
- 要描述的資料類型中隻有少量的簡單資料類型的屬性
- 要描述的資料類型在資料傳遞時要以複制的方式進行
- 要描述的資料類型中所有的屬性在進行傳遞時需要以複制的方式進行
- 不需要繼承另一個資料類型
- 比如:
- 定義幾何形狀的大小,封裝了一個 width屬性和 height屬性,兩者為 Double類型;
- 定義一定範圍的路徑,封裝了一個 start屬性和 length屬性,兩者為 Int類型;
- 定義三維坐标系的一個點,封裝了 x , y 和 z屬性,它們是 Double類型。