2016-10-09 142 views
0

當我通過Swift文檔時,我瞭解到有兩種方法可以在類中「初始化」變量。初始值與默認屬性值

  1. 通過簡單地聲明默認屬性值:
class Vehicle { 
    var numberOfWheels = 4 
    var currentSpeed = 0.0 
    var description: String { 
     return "traveling at \(currentSpeed) per hour" 
    } 
    func makeNoise() { 
     print("vroom vroom") 
    } 
} 

class Bicycle: Vehicle { 
    var hasBasket = true 
} 
  • 通過使用init方法
  • class Vehicle { 
        var numberOfWheels: Int 
        var currentSpeed: Double 
        init(numberOfWheels: Int, currentSpeed: Double) { 
         self.numberOfWheels = numberOfWheels 
         self.currentSpeed = currentSpeed 
        } 
        var description: String { 
         return "traveling at \(currentSpeed) per hour" 
        } 
        func makeNoise() { 
         print("vroom vroom") 
        } 
    } 
    
    class Bicycle: Vehicle { 
        var hasBasket: Bool 
        init() { 
         hasBasket = true 
         super.init(numberOfWheels: 2, currentSpeed: 10) 
        } 
    } 
    

    當然這兩個代碼樣本有不同的結果,但總的來說,第一種方法似乎有點乾淨(代碼少)。

    爲什麼我會用另一種解決方案,並且您看到任何問題或者解決方案都可以簡化的問題?

    回答

    1

    你的第二種方法(init)允許你傳入變量,使類更靈活。例如,如果你想通過具有不同數量的輪您的車輛類實例化各種車輛,可以傳入:

    let atv = Vehicle(numberOfWheels: 4, currentSpeed: 20) 
    let motorcycle = Vehicle(numberOfWheels: 2, currentSpeed: 40) 
    

    的默認值,你的觀點,是如果該值總是比同好得多必須爲所有課程傳遞一些不變的價值。

    另一種選擇就是實例,然後這樣做之後更新屬性:

    let atv = Vehicle() 
    atv.numberOfWheels = 4 
    

    但是,能夠與參數可能需要的各種原因進行初始化:

    1. 安全。您可能需要在初始化時要求這些類屬性獲取值

    2. 可讀性。更緊湊。

    3. 靈活性。您可以創建多種便利性,因此您可以使用不同的參數初始化您的車輛類別。說numberOfWheels是無關的,但你確實想用顏色初始化。你能想象一個方便的init這樣你就可以代替初始化是這樣的:

      讓rainbowVain =車輛(顏色:UIColor.White)

    關於你的第初始化方法,有時代碼是有點清潔以這種格式,尤其是viewControllers。

    var description: String { 
        return "traveling at \(currentSpeed) per hour" 
    } 
    

    這進入計算屬性,你可以看看更多如果感興趣。希望這有助於一些。

    +0

    小後續問題:在使用'let摩托車=車輛(..'和製作一個新的子類'摩托車:車輛?'之間? –

    +0

    它只是取決於我遵循的規則是做子類,如果我要去不止一次地使用它,或者它最好是代表它自己的可讀性和代碼組織的對象,但是很多這種風格和偏好都是每個編碼器獨有的,所以,如果我有一個不同的摩托車列表來表示,子類層可能是首選。 –

    +0

    謝謝伊恩。如果您在第二個代碼示例中看到任何編碼錯誤,請隨時發表評論(仍在學習) –