首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:在类中实现协议初始化器

Swift:在类中实现协议初始化器
EN

Stack Overflow用户
提问于 2017-02-22 16:41:21
回答 2查看 708关注 0票数 2

我试图理解为什么Swift强制执行一个符合协议的类,并根据需要标记一个初始化器。这实际上强制所有子类也实现该初始化器。指定的超类初始化器肯定会被继承吗?

以下引文摘自Swift语言指南:ref/doc/uid/TP40014097-CH25-ID272

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

代码语言:javascript
复制
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
    }
}

使用所需的修饰符确保在一致性类的所有子类上提供初始化器需求的显式或继承实现,使它们也符合协议。

编辑:我最初没有提到我目前仅限于SWIFT2.1。在这个版本中,它似乎是一个编译器问题,在以后的版本中没有出现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-22 17:15:17

指定的超类初始化器肯定会被继承吗?

不,不总是这样。如果子类定义了自己的指定初始化符,那么它将不会自动继承超类的指定初始化符。请考虑以下示例:

代码语言:javascript
复制
class Foo {
    init() {}
}

class Bar : Foo {

    var str: String

    init(str: String) {
        self.str = str
    }
}

let b = Bar() // illegal – what value would the 'str' property have?

由于Bar定义了自己的init(str:)指定初始化器,所以它不会自动继承Foo指定的初始化器init(),这样可以防止子类声明自己存储的属性时的不安全初始化。

init()标记为required强制执行Bar有一个init(),尽管它提供了自己的实现:

代码语言:javascript
复制
class Foo {
    required init() {}
}

class Bar : Foo {

    var str: String

    init(str: String) {
        self.str = str
    }

    // implement required init(), as Bar defines its own designated initialiser.
    required init() {
        self.str = "foo" // now str is correctly initialised when calling init()
    }
}

let b = Bar() // now legal

或者通过继承Foo的实现(当Bar没有定义自己指定的初始化程序时):

代码语言:javascript
复制
class Foo {
    required init() {}
}

class Bar : Foo {
    // inherits init() from Foo, as Bar doesn't define its own designed initialisers.
}

let b = Bar() // legal
票数 3
EN

Stack Overflow用户

发布于 2017-02-22 16:50:02

您没有强制在子类中实现初始化器。考虑一下这个示例,它编译得很好:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42397348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档