Object Oriented ProgrammingOOP:面向?qū)ο蠹娌褂脤ο蟆㈩惿彻⒗^承佛呻、封裝、屬性病线、方法吓著、擴(kuò)展、協(xié)議等
1送挑、基本特性:封裝绑莺、繼承、多態(tài)
封裝:盡可能隱蔽對象內(nèi)容細(xì)節(jié)让虐,對外行程一個邊界紊撕,只保留有限的對外接口
繼承:特殊類具有一般類的全部屬性和方法,一般類(父類赡突、基類)对扶,特殊類(子類、派生類)
多態(tài):父類中定義的屬性惭缰、方法浪南,在被子類繼承后,可以使同一個屬性漱受、方法络凿,在父類、子類中昂羡,具有不同的含義
2阳仔、類、結(jié)構(gòu)體钧椰、枚舉寞缝,都是面向?qū)ο蟮臄?shù)據(jù)類型
3、枚舉
enum 枚舉名 { 枚舉的定義(一組成員的值和一組相關(guān)值) }
Swift中蛹批,枚舉的成員值默認(rèn)不是整數(shù)類型撰洗,成員值前面要加上case
使用枚舉成員賦值時,枚舉類型名.成員值
在switch中使用枚舉腐芍,case必須全面包含枚舉中的所有成員
枚舉原始值
enum 枚舉名:數(shù)據(jù)類型(字符差导、字符串、整數(shù)猪勇、浮點數(shù))
{? case 成員名 = 默認(rèn)值 ?}
將枚舉的成員值轉(zhuǎn)換為原始值:枚舉名.成員名.rawValue
將枚舉的原始值轉(zhuǎn)換為成員值:枚舉名(rawValue: 原始值)
枚舉相關(guān)值
enum Figure {
case Rectangle(Int, Int)
case Circle(Int)
}
對于Figure设褐,Rectangle和Circle是相關(guān)值,都是元組類型,對于一個特定的Figure實例络断,只能有一個相關(guān)值
為了從相關(guān)值中提取數(shù)據(jù)裁替,可以在元組字段前面加let或var,如果元組中字段類型一致并且需要全部提取貌笨,可以將let或var移到相關(guān)值前面
.Rectangle(let width, let height) ? ? let .Rectangle(width, height)
4弱判、結(jié)構(gòu)體、類
Swift中的結(jié)構(gòu)體锥惋,不近可以定義成員變量昌腰,還可以定義方法,是一種輕量級的類膀跌,結(jié)構(gòu)體不具有繼承性遭商,不能強(qiáng)制類型轉(zhuǎn)換、使用析構(gòu)函數(shù)捅伤、使用引用計等
class 類名 { 定義類的成員 }
struct 結(jié)構(gòu)體名 { 定義結(jié)構(gòu)體的成員 }
classEmployee {
varno:Int=0
varname:String=""
varjob:String?
varsalary:Double=0
vardept :Department? ?將結(jié)構(gòu)體和類關(guān)聯(lián)起來
}
structDepartment {
varno:Int=0
varname:String=""
}
實例化: let emp = Employee() ?var dept = Department()劫流,實例化后,會開辟內(nèi)存空間
類一般聲明為let丛忆,類是引用數(shù)據(jù)類型祠汇,let說明不能修改引用,但引用指向的對象可以修改
5熄诡、引用類型的比較 === ?!===可很,比較兩個引用是否為同一個實例,結(jié)構(gòu)體和枚舉都是值類型凰浮,但不能用== ?!=我抠,必須重載=== ?!==運算符,定義相等規(guī)則
6袜茧、運算符重載
定義一個重載運算符的函數(shù)菜拓,在需要執(zhí)行被重載的運算符時調(diào)用該函數(shù)
func==(lhs:Department, rhs:Department) ->Bool{
returnlhs.name==rhs.name&&lhs.no==rhs.no
}
func!=(lhs:Department, rhs:Department) ->Bool{
if(lhs.name !=rhs.name||lhs.no!=rhs.no) {
returntrue
}
returnfalse
}
7、類型嵌套笛厦,類纳鼎、結(jié)構(gòu)體、枚舉可以進(jìn)行嵌套递递,在某一個類型的{}內(nèi)部定義類
8喷橙、可選鏈:顯示拆包(?-!)替換為(?-?)啥么,就是可選鏈登舞,遇到nil不會拋出錯誤,會把nil返回給引用者
9悬荣、訪問限定
訪問范圍主要有兩個:模塊菠秒、源文件
模塊:指一個應(yīng)用程序或者一個框架,用import關(guān)鍵字引入
源文件:.swift文件,編譯之后被包含在應(yīng)用程序包或框架中践叠,一個源文件包含一個面向?qū)ο箢愋停愌早汀⒔Y(jié)構(gòu)體、枚舉)禁灼,這些類型中又包含函數(shù)管挟、屬性等
訪問級別:open、public弄捕、internal僻孝、fileprivate、private
open:無論在自己模塊內(nèi)部守谓,還是在其他模塊(import語句引入其他模塊)都可以被訪問
public:在同一個模塊中穿铆,與open完全一樣,在不同模塊時斋荞,public所聲明的類不能被繼承荞雏,public所聲明的屬性和方法不能被重寫
internal:默認(rèn)訪問限定,只能在自己模塊中被訪問
fileprivate:只能在當(dāng)前源文件中被訪問
private:只能在類型內(nèi)部被訪問
10平酿、訪問級別使用原則
①如果一個類型定義為internal凤优、private,那么類型聲明的變量或常量不能使用public
②函數(shù)的訪問級別染服,不能高于它的參數(shù)和返回類型的訪問級別
③元素類型訪問級別别洪,遵循字段最低級的訪問級別
④枚舉中成員的訪問級別繼承于該枚舉
11、類和結(jié)構(gòu)體的異同
相同:定義存儲屬性柳刮、定義方法挖垛、定義下標(biāo)、定義構(gòu)造函數(shù)秉颗、定義擴(kuò)展痢毒、實現(xiàn)協(xié)議
不同:只有類才能繼承、核對運行時對象的類型蚕甥、析構(gòu)對象釋放資源哪替、引用計數(shù)允許一個實例有多個引用
結(jié)構(gòu)體是值類型,每一個實例沒有獨一無二的標(biāo)識
類是引用類型菇怀,每一個實例都有獨一無二的標(biāo)識