類
類的實質是一種數據類型塘装,類似于int、char等基本類型,不同的是它是一種復雜的數據類型爱致。因為它的本質是類型,而不是數據脾还,所以不存在于內存中缕棵,不能被直接操作,只有被實例化為對象時赠潦,才會變得可操作奶甘。
封裝(Encapsulation) 將程序的實現細節(jié)隱藏的一種方法
目的是保護數據和算法是代碼更加容易理解和維護
實現手段
訪問權限控制
默認 internal
public:可以在任何地方訪問
internal:在模塊 framwork 靜態(tài)庫可以訪問
private:只能定義的文件使用
存儲屬性
類可以直接存儲數據的屬性 成員變量
例如 var name="xiaomao"
可以獲取設置或修改屬性類容的時機
例如:
class Animal{
var name:String!
var age:Double!{
willSet(newValue){print("\(age)將要設置為:\(newValue)")}
didSet{print("已經設置為:\(age)")}
}
init(){
name="aaa"
age=10
}
}
測試:
var ani=Animal()
ani.age=28
輸出:
10.0將要設置為:28.0
已經設置為:28.0
計算屬性
本身不能存儲數據,而是由對象的其他數據計算出來
例如 定義一個圓
確定了半徑就能確定面積
確定了面積也能確定半徑
class Circle {
var r:Double=0
var area:Double!{
set(newArea){
print("原來面積:",area,"現在面積:",newArea)
r=sqrt(newArea/3.14)
}
get{return r*r*3.14}
}
}
測試:
var cir=Circle()
cir.r=10
print("半徑:",cir.r,"面積:",cir.area)
cir.area=3.14
print("半徑:",cir.r,"面積:",cir.area)
輸出:
半徑: 10.0 面積: 314.0
原來面積: 314.0 現在面積: 3.14
半徑: 1.0 面積: 3.14
繼承(inherita):
子類繼承父類所有除了私有以外的功能和屬性
子類在父類上可擴張
子類可以重新定義父類的一些功能
swfit 只能單繼承
重寫(覆蓋):
重新定義父類一些方法
需要加關鍵字override
范例:
定義動物類
class Animal{
var name:String!
var age:Double=0
}
var weigth:Double!
init(){
name="animal"
age=10
weigth=10
}
func eat() {
print(name,"吃東西了!")
}
}
狗繼承Animal重寫eat() 新增bite()
class Dog: Animal {
func bite() {
print(name,"咬了一口!")
}
override func eat() {
print(name,"吃了一根骨頭")
}
}
貓繼承Animal重寫eat() 新增claw()
class Cat: Animal {
func claw() {
print(name,"抓了一下")
}
override func eat() {
print(name,"吃了一條魚干")
}
}
測試用例:
let cat1=Cat()
cat1.name="白玉靈貓"
var dog1=Dog()
dog1.name="單身汪"
var ani=Animal()
ani.name="動物"
dog1.bite()
cat1.claw()
dog1.eat()
cat1.eat()
ani.eat()
//Animal可以轉換為Dog
//dog1=Animal()
//反過來不行
//報錯Cannot assign value of type 'Animal' to type 'Dog'
ani=Dog()
ani.name="霹靂狗"
ani.eat()
//強轉為Dog 調用bite()
dog1=ani as! Dog
dog1.bite()
//執(zhí)行子類實現 eat()
ani=Cat()
ani.name="黃玉靈貓"
ani.eat()
輸出
單身汪 咬了一口!
白玉靈貓 抓了一下
單身汪 吃了一根骨頭
白玉靈貓 吃了一條魚干
動物 吃東西了!
霹靂狗 吃了一根骨頭
霹靂狗 咬了一口!
黃玉靈貓 吃了一條魚干
多態(tài)(Polymorphism)
給多個不同類型的對象發(fā)送同一消息(即調用同一方法),系統(tǒng)根據對象不同執(zhí)行不同操作
注意!當一個父類的變臉引用他的一個子類對象,并且調用父類被覆蓋(重寫)的方法時,執(zhí)行子類實現!
測試
var ani=Animal()
ani.eat()
ani=Dog()
ani.eat()
ani=Cat()
ani.eat()
輸出
animal 吃東西了!
animal 吃了一根骨頭
animal 吃了一條魚干
鏈接
protocol (協(xié)議)的簡單理解
http://www.reibang.com/p/4988132b2b86
extension(括展)的簡單理解
http://www.reibang.com/p/43acce50c680