【问题标题】:How can I add a required property to a subclass that has to implement a required initializer?如何将必需的属性添加到必须实现必需的初始化程序的子类?
【发布时间】:2014-12-14 01:57:06
【问题描述】:

这是场景。我有三个班级:ABCA 类是 B 的子类。类C 需要将其实例变量之一传递给类A(我们称之为b)。我想确保它在C 初始化A 时发生,以确保我不会遇到b 为nil 的任何情况。以下是AB 的结构:

class B {
  var a: Type1

  required init(a: Type) {
    ...
  }
}

class A : B {
  var b: Type2
  ...
}

Swift 规则规定必须在初始化时定义非可选或隐式解包的变量。但是,由于我必须实现 B 的初始化(我无法控制 B;由 Apple 提供)我不能保证,因为我不能向 A 的初始化程序添加额外的参数。

我想确保使用A(b)A(a,b) 调用A,而不是A(a),以确保初始化b。我尝试寻找解决方案或考虑使用协议或扩展的解决方案,但我无法弄清楚。我得到的答案是通过this 回答,但它并没有真正做到我想要的。

所以我有两个问题(一个无效另一个): 1. [显而易见的] 有解决办法吗? (我是否遗漏了一些非常明显的东西?) 2. 我是不是搞错了?我应该使用不同的模式吗?

谢谢!

【问题讨论】:

    标签: oop swift generics swift-extensions


    【解决方案1】:

    如果我正确理解了这个问题,这应该可以:

    class B {
        var a: Type1
    
        init(a: Type1) {
            self.a = a
        }
    }
    
    class A : B {
        var b: Type2
    
        init(a: Type1, b: Type2) {
            self.b = b
            super.init(a: a)
        }
    }
    

    【讨论】:

    • 这行得通,但问题是我必须按要求拥有 B 的 init(我不允许更改它)。
    • 哦,我明白了。好吧,文档说:“在类初始化程序的定义之前编写 required 修饰符,以指示该类的每个子类都必须实现该初始化程序”我会说,您必须实现该初始化程序。但是,它还说:“如果您可以使用继承的初始化程序满足要求,则不必提供所需初始化程序的显式实现。”因此,如果您在 B 类中有一个继承的初始化程序,那么您就不需要所需的。否则,我也会感兴趣。
    猜你喜欢
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多