17.Swift學習之類

類的介紹和定義

  • Swift雖然推薦面向協議編程,但其也是一門面向對象開發的語言
  • 面向對象的基礎是類,類產生了對象
  • 在Swift中如何定義類呢? Swift中用class關鍵字定義類

定義語法

class 類名  {
    // 定義屬性和方法
}
  • 舉例
  class VideoMode {
      var resolution = Resolution()
      var interlaced = false
      var frameRate = 0.0
      var name: String?
  }
  • 解讀
    • 定義了一個名叫 VideoMode的類
    • 這個類有四個變量存儲屬性
      • resolution,用 Resolution結構體實例來初始化,它使屬性的類型被推斷爲 Resolution。
      • interlaced爲 false
      • frameRate爲 0.0
      • name屬性會自動被賦予一個空值 nil ,因爲它是一個可選型

類的實例

  • 需要藉助構造函數,結構體一樣,在名稱後面加一個()
let someVideoMode = VideoMode()

訪問屬性

  • 可以用點語法來訪問一個實例的屬性
print("The width of someResolution is \(someVideoMode.interlaced)")
  • 對於複合類型的屬性,可以一直通過.下去來訪問子屬性
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
  • 賦值給一個屬性
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")

類是引用類型

  • 不同於值類型,在引用類型被賦值到一個常量,變量或者本身被傳遞到一個函數的時候它是不會被拷貝的,而使用的是同一個對某個實例的引用。
//定義一個VideoMode類的對象
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

//定義一個常量等於上面的類的對象
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

//同時改變
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")

特徵運算符

  • 因爲類是引用類型,可能有很多常量和變量都是引用到了同一個類的實例。有時候找出兩個常量或者變量是否引用自同一個類實例非常有用,Swift提供了兩個特點運算符來檢查兩個常量或者變量是否引用相同的實例。
    • 相同於 ( ===)
    • 不相同於( !==)
if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}

繼承

  • 一個類可以從另一個類繼承方法、屬性和其他的特性。當一個類從另一個類繼承的時,繼承的類就是子類,被繼承的就是父類
  • 定義一個父類
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
       
    }
}
  • 定義一個子類
class Bicycle: Vehicle {
    var hasBasket = false
}

重寫

  • 所謂重寫就是子類可以對繼承自父類實例方法、類型方法、實例屬性,類型屬性進行覆蓋
  • 重寫需要在前面加上 override 關鍵字
  • override 關鍵字執行時Swift 編譯器會檢查重寫的類的父類(或者父類的父類)是否有與之匹配的聲明來提供重寫
class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}
  • 防止被重寫
    • 可以通過標記阻止這種行爲:final var , final func , final class func

類與結構體的對比

  • 相同點
    • 定義屬性
    • 定義方法
    • 定義初始化器
    • 可以被擴展
    • 遵循協議
  • 類有而結構體沒有的額外功能
    • 繼承
    • 類型轉換
    • 析構
    • 引用計數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章