1、類的定義
1.1 Swift也是一門面向?qū)ο箝_發(fā)的語言。面向?qū)ο蟮幕A(chǔ)是類,類產(chǎn)生了對象。
在Swift中如何定義類呢?
class是Swift中的關(guān)鍵字,用于定義類。
類的定義格式:
class 類名 : SuperClass {
// 定義屬性和方法
}
定義的類,可以沒有父類.那么該類是rootClass
通常情況下,定義類時繼承自NSObject(非OC的NSObject)
// 1、 定義一個基類
class Animal {
}
// 2、定義一個繼承自NSObject的類
class Dog : NSObject {
}
// 3、定義一個類并聲明了 skinColor age 屬性 因為類中的屬性通常會進行賦值 所以會設(shè)置var 類型
class cat : NSObject {
var skinColor : String? = nil
var age : Int = 0
}
// 4、繼承自AnimalA
class Cow : AnimalA {
var age : Int = 0
}
let cow = Cow()
cow.age = 2
// 5、繼承自AnimalB 的類
class Dog : AnimalB {
var skinColor : String? = nil
var age : Int = 0
}
// 如果繼承自NSObject可以使用KVC進行賦值
let dog = Dog()
dog.setValuesForKeys(["skinColor" : "white" , "age" : 2 ])
1.2 屬性
存儲屬性是最簡單的屬性,它作為類實例的一部分,用于存儲常量和變量。
可以給存儲屬性提供一個默認(rèn)值,也可以在初始化方法中對其進行初始化。
計算屬性并不存儲實際的值,而是提供一個getter和一個可選的setter來間接獲取和設(shè)置其它屬性。計算屬性一般只提供getter方法。如果只提供getter,而不提供setter,則該計算屬性為只讀屬性,并且可以省略get{}
類屬性是與類相關(guān)聯(lián)的,而不是與類的實例相關(guān)聯(lián)。所有的類和實例都共有一份類屬性.因此在某一處修改之后,該類屬性就會被修改。類屬性的設(shè)置和修改,需要通過類來完成,類屬性使用static來修飾。
類的屬性的寫法:
存儲屬性的寫法
var 屬性名 : 類型 = 0
var 屬性名 : 類型 ? = nil
var 屬性名 : 類型 ?
計算類型:
var 屬性名 : 類型 {
計算操作
return 需要的屬性值
}
類屬性:
static 屬性名 : 類型 = 0
static 屬性名 : 類型 ? = nil
// 6、存儲屬性 、 計算屬性 和 類屬性
class Student : NSObject {
// 定義屬性
var age : Int = 0 // 定義存儲屬性
var name : String? = nil // nil 也是一種數(shù)據(jù)類型
var Sex : String? // 可選類型不賦值默認(rèn)也是nil的
var mathScore : Double = 0.0
var chineseScore : Double = 0.0
//定義方法 返回平均成績
func getAverageScore() -> Double {
return (mathScore + chineseScore )*0.5
}
// 這是一個計算屬性的寫法
var averageScore : Double {
let aver = (mathScore + chineseScore )*0.5
print(aver)
return aver
}
// 定義一個類屬性 : 類屬性是和整個類相關(guān)的屬性 ,通過類名來訪問 用來定義單例的時候使用比較多
static var courseCount : Int = 0
}
let stu = Student()
stu.age = 10
stu.name = "劉德華"
stu.Sex = "man"
stu.mathScore = 80.0
stu.chineseScore = 90.0
// 可選綁定
if let name = stu.name {
print(name)
}
let avergScore = (stu.mathScore + stu.chineseScore) * 0.5
let aver = stu.getAverageScore()
stu.averageScore
Student.courseCount = 2 // 使用類名訪問類屬性 Student.age 是不支持的 這樣寫就錯誤了
使用KVO監(jiān)聽類的屬性的變化
在OC中我們可以重寫set方法來監(jiān)聽屬性的改變,Swift中可以通過屬性觀察者來監(jiān)聽和響應(yīng)屬性值的變化。通常是監(jiān)聽存儲屬性和類屬性的改變(對于計算屬性,我們不需要定義屬性觀察者,因為我們可以在計算屬性的setter中直接觀察并響應(yīng)這種值的變化)。
我們通過設(shè)置以下觀察方法來定義觀察者
willSet:在屬性值被存儲之前設(shè)置。此時新屬性值作為一個常量參數(shù)被傳入。該參數(shù)名默認(rèn)為newValue,我們可以自己定義該參數(shù)名。
didSet:在新屬性值被存儲后立即調(diào)用。與willSet相同,此時傳入的是屬性的舊值,默認(rèn)參數(shù)名為oldValue。
willSet與didSet只有在屬性第一次被設(shè)置時才會調(diào)用,在初始化時,不會去調(diào)用這些監(jiān)聽方法。
