ios - 初始化程序与默认属性值

标签 ios swift oop

在浏览 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
}
  1. 使用初始化方法
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)
    }
}

当然这两个代码示例有不同的结果,但总的来说,第一种方法似乎更简洁(代码更少)。

为什么我会使用一个而不是另一个,您是否发现任何问题或可以在任一解决方案中简化的事情?

最佳答案

您的第二个方法 (init) 允许您传入变量,这使类更加灵活。例如,如果您想通过具有不同数量车轮的 Vehicle 类实例化各种车辆,您可以传入:

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

就您的观点而言,如果值始终相同,则默认值比必须为所有类传递一些常量值要好得多。

另一种选择是实例化,然后在这样做之后更新属性:

let atv = Vehicle()
atv.numberOfWheels = 4

但是由于各种原因可能需要能够使用参数进行初始化:

  1. 安全。您可能希望要求这些类属性在初始化时获得值

  2. 可读性。更紧凑。

  3. 灵 active 。您可以创建多个便利的 init,以便您可以使用不同的参数初始化您的车辆类别。说 numberOfWheels 是无关紧要的,但你确实想用颜色初始化。您可以想象一个方便的 init,这样您就可以像这样初始化:

    让 rainbowVain = Vehicle(color: UIColor.White)

对于您的第一个初始化方法,有时这种格式的代码会更简洁一些,尤其是对于 viewControllers。

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

这涉及计算属性,如果有兴趣,您可以深入研究。希望这对一些人有所帮助。

关于ios - 初始化程序与默认属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39941192/

相关文章:

javascript - 在 Javascript 中将 var 转换为自定义类

c# - 为什么 LINQ 运算符被定义为 IEnumerable 接口(interface)上的扩展方法,而不是接口(interface)本身的一部分? C#

ios - 设备旋转后调用 invalidateLayout() 或 reloadData() 重新加载从 Storyboard 创建的 UICollectionView

iphone - 在核心数据中保存 CFDictionaryRef

ios - 文件路径中可选值的解包错误

swift - 如何从 viewcontroller 访问 tableview 单元格的属性?

Java - 都是实例对象吗?所有对象都是实例吗?

ios - 方法 'application:openURL:options:'未被调用

ios - 优化捕获列表

ios - UIView.init() 从哪里来?