2016-10-09 146 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

    谢谢伊恩。如果您在第二个代码示例中看到任何编码错误,请随时发表评论(仍在学习) –