swift - 为什么 Swift 构造函数使用命名参数调用?

标签 swift

Swift 编程语言的示例代码不会在第一行调用 super.init。这似乎是一种不安全的做法,因为继承的项可以被父构造函数覆盖,对吗?

class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }

    var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
    }

    override func simpleDescription() -> String {
        return "An equilateral triagle with sides of length \(sideLength)."
    }
}

最佳答案

在初始化程序中,您必须在调用 super.init() 之前完全准备好对象。这意味着在调用初始化器的 super 实现时,子类声明的所有属性都需要有一个值。

调用super.init()后,您可以覆盖从父类(super class)继承的属性。 numberOfSides 是一个继承的属性,因此它在调用 super 实现之后被覆盖。
numberOfSides =self.numberOfSides = 在此示例中是等效的。

简而言之:
1. 子类声明的属性必须在调用super.init()之前设置
2. 调用super.init()后必须覆盖继承的属性

对于第一种情况,编译器会抛出错误,但我不确定后者。

关于swift - 为什么 Swift 构造函数使用命名参数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24231401/

相关文章:

ios - 从选项卡栏 Controller 以模态方式呈现 View Controller

ios - 模糊效果 - 背景 UITextField

swift - 更改 ViewController MacOS Swift

ios - 从 xib 加载 View 的正确方法是什么?

iOS Swift WKWebView 不缩放

ios - Firebase 身份验证 (Swift 3) 的多个错误

ios - 如何在 Swift 中更改 CATextLayer 中的文本颜色

ios - Swift 中的 UITableView – 未知异常

ios - 滚动按钮单击 ScrollView/WKWebView,Swift

ios - AudioKit 崩溃