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

时间:2014-06-15 15:51:53

标签: swift

Swift Programming Language的示例代码不会在第一行调用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)."
    }
}

1 个答案:

答案 0 :(得分:2)

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

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

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

后,必须覆盖继承的属性

编译器会为第一种情况引发错误,但我不确定后者。