Swift:在类

时间:2017-02-22 16:41:21

标签: swift inheritance swift-protocols

我试图理解为什么Swift强制执行符合协议的类,并将初始化程序标记为必需。这实质上强制任何子类也实现该初始化程序。当然,指定的超类初始化程序会被继承吗?

以下引用来自Swift语言指南: https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID272

  

您可以在符合标准上实现协议初始化程序要求   class作为指定的初始化程序或便捷初始化程序。   在这两种情况下,您都必须使用标记初始化程序实现   必需的修饰符:

class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
        // initializer implementation goes here
    }
}

class SomeSubclass: SomeClass {
    required init(someParameter: Int) { // enforced to implement init again
        // initializer implementation goes here
    }
}
  

使用必需的修饰符可确保您提供显式   或者继承所有的初始化程序要求的实现   符合类的子类,使它们也符合   协议

修改 我最初没有提到我目前仅限于Swift 2.1。它似乎是此版本中的编译器问题,并且不会在更高版本中出现。

1 个答案:

答案 0 :(得分:2)

您不会强制在子类中实现初始值设定项。考虑这个例子,编译得很好:

protocol SomeProtocol {
    init(someParameter: Int)
}


class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
        // initializer implementation goes here
        print(someParameter)
    }
}


class SomeSubclass: SomeClass {
    // Notice that no inits are implemented here
}

_ = SomeClass(someParameter: 123)
_ = SomeSubclass(someParameter: 456)