Swift入門(mén)基礎(chǔ)6——擴(kuò)展、泛型柠傍、協(xié)議

擴(kuò)展

Swift中的擴(kuò)展麸俘,對(duì)應(yīng)OC中的分類(lèi),可以用它來(lái)拓展類(lèi)的功能惧笛。

可以擴(kuò)展類(lèi)的什么:

添加新的屬性(只能是計(jì)算型屬性)从媚,且也不能為已有的屬性添加屬性觀察器;
添加新方法(實(shí)例方法和類(lèi)方法)患整;
添加新的構(gòu)造器(只是便利構(gòu)造器)拜效;
甚至還可以在該擴(kuò)展中使該類(lèi)符合某個(gè)協(xié)議,即申明該類(lèi)遵守某個(gè)協(xié)議各谚。

注意:
擴(kuò)展僅可以為類(lèi)添加新的功能紧憾,但不能重寫(xiě)該類(lèi)原有的方法等。
某類(lèi)的擴(kuò)展是可以訪問(wèn)該類(lèi)的屬性方法的昌渤。

擴(kuò)展語(yǔ)法:

extension Int就表示這是對(duì)Int類(lèi)型的擴(kuò)展赴穗。

extension Int {
    var numStr: String {
        get{
            return "\(self)次"
        }
    }
    func printTheNum() {
        print(numStr)
    }
    func repeats(task: ()->Void) {
        for _ in 0..<self {
            task()
        }
    }
}

Int的擴(kuò)展中,我們首先為Int添加了只讀計(jì)算型屬性numStr,它是以該Int型的數(shù)值拼接成的字符串般眉。然后又新添了兩個(gè)方法了赵。printTheNum()方法的功能是打印numStr屬性。repeats(task:)方法有一個(gè)參數(shù)task甸赃,其類(lèi)型為()->Void柿汛,即沒(méi)有參數(shù)沒(méi)有返回值的閉包!傳入該方法的閉包將會(huì)被執(zhí)行該數(shù)值次埠对。
調(diào)用:

        let num = 2
        num.printTheNum() // log:2次
        num.repeats {
            print("i am your man")
        }
//      log: i am your man
//           i am your man
可變實(shí)例方法:

如果在擴(kuò)展中新添的方法修改了self或者self的屬性络断,則必須以關(guān)鍵字mutating標(biāo)注。

    mutating func squre() {
        self = self*self
    }

泛型:

什么是泛型项玛?

通俗說(shuō)一下貌笨,就是一個(gè)函數(shù),或者類(lèi)稍计,使用到某個(gè)(或多個(gè))參數(shù)躁绸,這個(gè)參數(shù)的類(lèi)型,在設(shè)計(jì)期間是可供多選的臣嚣,那么這個(gè)函數(shù)(類(lèi))净刮,就稱(chēng)作泛型函數(shù)(泛型類(lèi))。

泛型約束:

泛型約束就是指定這個(gè)泛型使用到的可選類(lèi)型的選擇范圍——也就是說(shuō)指定它必須有的某些特征硅则,因?yàn)榉盒秃瘮?shù)(泛型類(lèi))里需要用到這些特征淹父,所以調(diào)用方使用泛型時(shí)候,指定的可選參數(shù)類(lèi)型也必須具有這些特征怎虫。

數(shù)字和字典這些集合類(lèi)就是典型的“泛型”暑认,這些集合可以存放很多類(lèi)型的數(shù)據(jù)。如果沒(méi)有泛型大审,那想象一下蘸际,我們得定義多少種數(shù)組初始化的方式。


協(xié)議:

協(xié)議是什么無(wú)需再做解釋?zhuān)苯觼?lái)看Swift中它的語(yǔ)法:

協(xié)議語(yǔ)法:
protocol SomProtocol {
    // 這里是協(xié)議要定義的東西
}

在Swift中表示類(lèi)實(shí)現(xiàn)協(xié)議和繼承是一樣的徒扶,都用冒號(hào):粮彤,若實(shí)現(xiàn)多個(gè)協(xié)議則多個(gè)協(xié)議之間同樣也用逗號(hào)隔開(kāi)。
當(dāng)一個(gè)類(lèi)既有繼承父類(lèi)姜骡,又實(shí)現(xiàn)了某協(xié)議時(shí)导坟。規(guī)定冒號(hào)后面先是繼承的類(lèi),然后才是實(shí)現(xiàn)的協(xié)議圈澈。

下面的代碼定義了一個(gè)StaffModel類(lèi)惫周,它繼承于UserModel,并且還實(shí)現(xiàn)了兩個(gè)協(xié)議SomProtocol,OtherProtocol康栈。

class StaffModel: UserModel, SomProtocol, OtherProtocol {

}
屬性要求:

協(xié)議中可以定義對(duì)所遵守該協(xié)議的類(lèi)中屬性的要求递递∨绯龋可以要求屬性的類(lèi)型、名字漾狼,以及可讀還是可寫(xiě)重慢。

下面定義的協(xié)議SomProtocol中定義了所遵守該協(xié)議的類(lèi)中屬性的要求饥臂。必須要有個(gè)叫fullName的逊躁,字符串類(lèi)型的,可讀可寫(xiě)的屬性隅熙。

protocol SomProtocol {
    var fullName: String {get set}
    
}
方法要求:

協(xié)議中定義對(duì)方法的要求稽煤。只有方法的定義,沒(méi)有對(duì)應(yīng)的方法體囚戚。

protocol SomProtocol {
    var fullName: String {get set}
    func nameHandle(fullName: String) -> String
}
構(gòu)造器要求:

協(xié)議中也可以定義對(duì)構(gòu)造器的要求酵熙。基本和定義方法是一樣驰坊。但是在實(shí)現(xiàn)該協(xié)議的類(lèi)中實(shí)現(xiàn)該構(gòu)造器時(shí)匾二,無(wú)論在類(lèi)中是作為指定構(gòu)造器還是便利構(gòu)造器,都要在前面加上required關(guān)鍵字拳芙。

protocol SomProtocol {
    var fullName: String {get set}
    init(fullName: String)
    func nameHandle(fullName: String) -> String
}
class StaffModel: UserModel, SomProtocol {
    var fullName: String = "" // SomProtocol協(xié)議要求的屬性
    required init(fullName: String) { // 協(xié)議要求的構(gòu)造器
        self.fullName = fullName
        super.init()
    }
    func nameHandle(fullName: String) -> String { // 協(xié)議要求的方法
        return "fullName:\(fullName)"
    }
}
協(xié)議可以作為類(lèi)型

協(xié)議可以作為變/常量察藐、屬性、方法參數(shù)舟扎、集合類(lèi)元素的類(lèi)型分飞。表示實(shí)現(xiàn)了該協(xié)議的任何一種實(shí)例。

通過(guò)協(xié)議實(shí)現(xiàn)協(xié)議

有時(shí)不方便在原類(lèi)中實(shí)現(xiàn)協(xié)議睹限,那我們通過(guò)擴(kuò)展來(lái)實(shí)現(xiàn)協(xié)議可以達(dá)到一樣的效果譬猫。

更多請(qǐng)參考:Swift中協(xié)議的簡(jiǎn)單介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羡疗,隨后出現(xiàn)的幾起案子染服,更是在濱河造成了極大的恐慌,老刑警劉巖叨恨,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳刮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡特碳,警方通過(guò)查閱死者的電腦和手機(jī)诚亚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)午乓,“玉大人站宗,你說(shuō)我怎么就攤上這事∫嬗” “怎么了梢灭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵夷家,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敏释,道長(zhǎng)库快,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任钥顽,我火速辦了婚禮义屏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜂大。我一直安慰自己闽铐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布奶浦。 她就那樣靜靜地躺著兄墅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澳叉。 梳的紋絲不亂的頭發(fā)上隙咸,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音成洗,去河邊找鬼五督。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泌枪,可吹牛的內(nèi)容都是我干的概荷。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碌燕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼误证!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起修壕,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愈捅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后慈鸠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蓝谨,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年青团,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了譬巫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡督笆,死狀恐怖芦昔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娃肿,我是刑警寧澤咕缎,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布珠十,位于F島的核電站,受9級(jí)特大地震影響凭豪,放射性物質(zhì)發(fā)生泄漏焙蹭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一嫂伞、第九天 我趴在偏房一處隱蔽的房頂上張望孔厉。 院中可真熱鬧,春花似錦末早、人聲如沸烟馅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刊驴,卻和暖如春姿搜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捆憎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工舅柜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躲惰。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓致份,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親础拨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氮块,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,823評(píng)論 1 10
  • 擴(kuò)展 擴(kuò)展就是向一個(gè)已有的類(lèi)、結(jié)構(gòu)體诡宗、枚舉類(lèi)型或者協(xié)議類(lèi)型添加新功能滔蝉。這包括在沒(méi)有權(quán)限獲取原始源代碼的情況下擴(kuò)展類(lèi)...
    cht005288閱讀 467評(píng)論 0 0
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 11,011評(píng)論 6 13
  • 136.泛型 泛型代碼讓你可以寫(xiě)出靈活,可重用的函數(shù)和類(lèi)型,它們可以使用任何類(lèi)型,受你定義的需求的約束。你可以寫(xiě)出...
    無(wú)灃閱讀 1,480評(píng)論 0 4
  • Hello Word 在屏幕上打印“Hello, world”塔沃,可以用一行代碼實(shí)現(xiàn): 你不需要為了輸入輸出或者字符...
    restkuan閱讀 3,193評(píng)論 0 6