swift 語言的基礎 - Class / Struct / Enum

  1. Class
    1. 物件的初始化 Initialization
    2. 先給一個預設值,後面再來改
    3. Optional Type
    4. Init Function
    5. Init Function With Paramter
  2. 物件的類別 Property
  3. 未完待續

Class

物件的初始化 Initialization

我們想要有一個 Car Class,其用意是做一輛車 , 內容有 顏色、品牌和幾個門,程式示意如下:


class Car {
  var color: Color
  var brand: String
  var doors: Int
}

這裡其實會出錯,原因在於,當我們想要創建一個車的時候,color,brand,doors 因為沒有給初始值, 所以程式不給過。有幾種不同的寫法,可以解初始值的問題

先給一個預設值,後面再來改


class Car {
  var color: Color = .black
  var brand: String = "Volvo"
  var doors: Int = 4
}

Optional Type


class Car {
  var color: Color?
  var brand: String?
  var doors: Int?
}

Init Function


class Car {
  var color: Color
  var brand: String
  var doors: Int

  init() {
    color = .blue
    brand = "BMW"
    doors = 2
  }
}

Init Function With Paramter


class Car {
  var color: Color
  var brand: String
  var doors: Int

  init(color:Color, brand:String,doors:Int) {
    this.color = color
    this.brand = brand
    this.doors = doors
  }

}

提示: 一旦使用參數做初始化的話 預設的init(){} 就會失效,想要的話 就要手動補回去


class Car {
  var color: Color
  var brand: String
  var doors: Int

  init(color:Color, brand:String,doors:Int) {
    this.color = color
    this.brand = brand
    this.doors = doors
  }

  init() {
    color = .yellow
    brand = "BENZ"
    doors = 5
  }

}

物件初始化若有可能失敗,那我們要利用 init? 回傳nil


class Car {
  var color: Color
  var brand: String
  var doors: Int

  init?(color:Color, brand:String,doors:Int) {
    
    if(doors>10){  //10門的車應該就做不出來了吧?
      return nul
    }
    this.color = color
    this.brand = brand
    this.doors = doors

  }

}

物件的類別 Property


class Car {
  var color: Color?
  var brand: String?
  var doors: Int?
}

color,brand,doors 是這輛車的屬性,(一般稱之為 stored property), 當我們創建了一輛車,就可以賦予屬性的值,以及取用屬性的值。


var car1 = Car()

print(car1.color)  //nil
car1.color = .purple
print(car1.color)  //.purple

屬性也可以經由計算的結果來取得和設定 (computed property)


class Car {
  var color: Color?
  var brand: String?
  var doors: Int?
  var persons : Int {
    get {
          if(brand=="BMW"){
            return 2
          }else{
            return 4
          }
            
    }
    set {
          if(newValue==2){
            brand = "BMW"
          } 
    }
  }

}

另外,也可以觀察屬性的變化(property observer),預先給好取值與賦值的規則


class Car {
  var color: Color?
  var brand: String?
  var doors: Int?
  var persons : Int = 4
   {
      willSet {
        if persons <= 0 {
            println("人數小於等於0的車是不存在的")
        }
      }
      didSet {
        if persons <= 0 {
            persons = oldValue
        }
      }
  }

}

lazyload

未完待續


轉載請註明來源,歡迎對文章中的引用來源進行考證,歡迎指出任何有錯誤或不夠清晰的表達。可以郵件至 [email protected]