Swift ~ 方法渔工、下標(biāo)、繼承

本文源自本人的學(xué)習(xí)記錄整理與理解桥温,其中參考閱讀了部分優(yōu)秀的博客和書(shū)籍引矩,盡量以通俗簡(jiǎn)單的語(yǔ)句轉(zhuǎn)述。引用到的地方如有遺漏或未能一一列舉原文出處還望見(jiàn)諒與指出侵浸,另文章內(nèi)容如有不妥之處還望指教旺韭,萬(wàn)分感謝。

方法

  • 枚舉掏觉、結(jié)構(gòu)體区端、類(lèi)都可以定義實(shí)例方法、類(lèi)方法
  • 實(shí)例方法:通過(guò)實(shí)例對(duì)象調(diào)用
  • 類(lèi)方法:通過(guò)類(lèi)型調(diào)用澳腹,用static或者class關(guān)鍵字定義
  • self: 在實(shí)例方法中代表實(shí)例對(duì)象织盼,在類(lèi)型方法中代表類(lèi)型

class Person {
static var cout = 0
init() {
Person.cout += 1
}
//這里的cout 等價(jià)于self.cout、Person.self.cout酱塔、Person.cout
static func getCount() -> Int {
cout
}

}

mutating

  • 結(jié)構(gòu)體和枚舉是值類(lèi)型沥邻,默認(rèn)情況下值類(lèi)型屬性不能被自身的實(shí)例方法修改
  • 可以考慮在func關(guān)鍵字前加mutating可以允許這種修改行
struct Person {
 var x = 0.0, y = 0.0

mutating func run(deltX:Double, deltY:Double) {
   x += deltX
   y += deltY
}

@discardableResult

  • 在func前面加@discardableResult,可以消除:函數(shù)調(diào)用后返回值未被使用的警告??
struct Point {
var x = 0.0, y = 0.0
@discardableResult mutating func moveX(deltaX: Double) -> Double {
      x += deltaX
      return x
   }
} 

var p = Point()
p. moveX(deltaX:10)

下標(biāo)

  • 使用subscript可以給任意類(lèi)型(枚舉延旧、結(jié)構(gòu)體谋国、類(lèi))增加下標(biāo)功能槽地,有些地方也翻譯為:下標(biāo)腳本 迁沫;subscript 的語(yǔ)法類(lèi)似于實(shí)例方法、計(jì)算屬性捌蚊,本質(zhì)就是方法(函數(shù))
  • subscript中定義的返回值類(lèi)型決定了:
  1. get方法的返回值類(lèi)型
  2. set方法中newValue的類(lèi)型
  3. subscript可以接受多個(gè)參數(shù)集畅,并且類(lèi)型任意
  4. subscript可以沒(méi)有set方法,但必須要有get方法缅糟;如果只有get方法時(shí)可以省略get
class Point {
var x = 0.0, y = 0.0
//index:標(biāo)簽
subscript(index: Int) -> Double {

        set {
             if index ==0 {
                  x = newValue
            }else if index == 1 {
                 y = newValue
          }
       }

      get {
         
          if index  == 0 {
               return x
         }else if index == 1 {
           return y
        }
      }     
   }
} 

var p = Point()

p[0] = 11.3
p[1] = 22.2

print(p.x)//11.3
print(p.y)//22.2
print(p[0])//11.3
print(p[1])//22.2

注意點(diǎn):如果下標(biāo)的返回值是枚舉挺智,就不能拿到返回的枚舉直接修改其成員,需要再subscript內(nèi)部實(shí)現(xiàn)set方法窗宦;如果下標(biāo)返回值是類(lèi)赦颇,就不需要如此

  • 接收多個(gè)參數(shù)的下標(biāo)
實(shí)例.png

繼承

  • 值類(lèi)型(枚舉二鳄、結(jié)構(gòu)體)不支持集成,只有類(lèi)支持繼承

  • 沒(méi)有父類(lèi)的類(lèi)稱(chēng)之為:基類(lèi)媒怯,就是說(shuō)隨便自定義一個(gè)類(lèi)订讼,只要沒(méi)繼承其他類(lèi),那這個(gè)類(lèi)就是基類(lèi)

  • Swift并沒(méi)有像OC扇苞、Java那樣的規(guī)定:任何類(lèi)最終都要繼承自某個(gè)基類(lèi)

  • 子類(lèi)可以重寫(xiě)父類(lèi)的下標(biāo)欺殿、方法屬性鳖敷,重寫(xiě)必須加上override關(guān)鍵字

  • 屬性繼承的內(nèi)存示例

示例.png
  • 重寫(xiě)實(shí)例方法脖苏、下標(biāo)必須加override
示例.png
  • 重寫(xiě)類(lèi)型方法、下標(biāo)
  1. class 修飾的類(lèi)型方法定踱、下標(biāo)棍潘,允許被子類(lèi)重寫(xiě)
  2. static修飾的類(lèi)型方法、下標(biāo)崖媚,不允許被子類(lèi)重寫(xiě)
  3. 如果父類(lèi)定義方法時(shí)使用class修飾蜒谤,子類(lèi)重寫(xiě)時(shí)可以使用class也可以使用static來(lái)修飾
class示例.png
static示例.png
  • 重寫(xiě)實(shí)例屬性
  1. 子類(lèi)可以將父類(lèi)的屬性(存儲(chǔ)、計(jì)算)至扰,重寫(xiě)為計(jì)算屬性
  2. 相反子類(lèi)不可以將父類(lèi)的屬性(存儲(chǔ)鳍徽、計(jì)算),重寫(xiě)為存儲(chǔ)屬性
  3. 只能重寫(xiě)var屬性敢课,不能重寫(xiě)let屬性
  4. 重寫(xiě)時(shí)屬性名阶祭、類(lèi)型要一致
  5. 子類(lèi)重寫(xiě)后的屬性權(quán)限不能小于父類(lèi)的權(quán)限
    5.1> 如果父類(lèi)屬性是只讀的,那么子類(lèi)重寫(xiě)后的屬性可以是只讀的直秆、也可以是可讀可寫(xiě)的
    5.2> 如果父類(lèi)屬性是可讀可寫(xiě)的濒募,那么子類(lèi)重寫(xiě)后的屬性也必須是可讀可寫(xiě)的
基類(lèi)Circle.png
重寫(xiě)屬性.png
  • 重寫(xiě)類(lèi)型屬性
  1. class修飾的計(jì)算類(lèi)型屬性,可以被子類(lèi)重寫(xiě)
  2. static 修飾的類(lèi)型屬性(存儲(chǔ)圾结、計(jì)算)瑰剃,不可以被子類(lèi)重寫(xiě)
示例.png
  • 屬性觀(guān)察器
  1. 可以在子類(lèi)中為父類(lèi)屬性(除了只讀計(jì)算屬性、let屬性)增加屬性觀(guān)察器:willSet筝野、didSet

class Circle {
   //存儲(chǔ)屬性
   var redius: Int = 1
}

class SubCircle: Circle {

   override var redius: Int {

     willSet {
         print("SubCircle willSetRedius",newValue)
     }
    didSet {
        print("SubCircle didSet Redius",newValue)
     }

   }

}

var circle = SubCircle()
circle.radius = 10

示例2.png

-final

  1. final修飾的方法晌姚、下標(biāo)、屬性歇竟,禁止被重寫(xiě)
  2. final修飾的類(lèi)挥唠,禁止被繼承

多態(tài)的實(shí)現(xiàn)原理

  • OC : 通過(guò)Runtime的API來(lái)實(shí)現(xiàn)
  • C++ : 虛表(虛函數(shù)表)
  • Swift : 類(lèi)似于C++的實(shí)現(xiàn)方式,也是通過(guò)一張表

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焕议,一起剝皮案震驚了整個(gè)濱河市宝磨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖唤锉,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世囊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡窿祥,警方通過(guò)查閱死者的電腦和手機(jī)茸习,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壁肋,“玉大人号胚,你說(shuō)我怎么就攤上這事〗牛” “怎么了猫胁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)跛锌。 經(jīng)常有香客問(wèn)我弃秆,道長(zhǎng),這世上最難降的妖魔是什么髓帽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任菠赚,我火速辦了婚禮,結(jié)果婚禮上郑藏,老公的妹妹穿的比我還像新娘衡查。我一直安慰自己,他們只是感情好必盖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拌牲。 她就那樣靜靜地躺著,像睡著了一般歌粥。 火紅的嫁衣襯著肌膚如雪塌忽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天失驶,我揣著相機(jī)與錄音土居,去河邊找鬼。 笑死嬉探,一個(gè)胖子當(dāng)著我的面吹牛擦耀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甲馋,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼埂奈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迄损!你這毒婦竟也來(lái)了定躏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痊远,沒(méi)想到半個(gè)月后垮抗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碧聪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年冒版,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逞姿。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辞嗡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滞造,到底是詐尸還是另有隱情续室,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布谒养,位于F島的核電站挺狰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏买窟。R本人自食惡果不足惜丰泊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望始绍。 院中可真熱鬧瞳购,春花似錦、人聲如沸亏推。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)径簿。三九已至罢屈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篇亭,已是汗流浹背缠捌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留译蒂,地道東北人曼月。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柔昼,于是被迫代替她去往敵國(guó)和親哑芹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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