【问题标题】:Ios Development Swift class & SubclassesiOS 开发 Swift 类和子类
【发布时间】:2017-07-27 15:05:42
【问题描述】:

我创建了一个具有 Condition 类型的变量存储属性的类。我初始化了课程,一切似乎都很好。

enum Condition {
    case poor
    case fair
    case excellent
}

class Shoe {

    var color: Condition?
    var laces: Condition?

    init(color: Condition, laces:Condition) {
        self.color = color
        self.laces = laces
    }
}

当我对我的基类进行子类化时,我遇到了编译器错误。

class Nike: Shoe {
    var texture: Condition?
    var sole: Condition?

    override init(color: Condition, laces: Condition) {
        self.texture = texture
        self.sole = sole
        super.init(color: Condition, laces: Condition)
    }
}

由于 (override init) 中的变量,我收到一个编译器错误,提示我正在为自己分配一个属性,我认为我必须这样做才能初始化这些值?

第 1 步:为子类的属性提供值。

第 2 步:子类初始化后,为基类的属性提供值。

【问题讨论】:

  • 不相关,但为什么属性是可选的,因为初始化程序是非可选的,枚举只能是三种情况之一??
  • 您正在将属性分配给它们自己。在这种情况下,self.texture 和 texture 是相同的属性。
  • Vadian,我是 swift 和一般编码的新手。我认为这些对象必须是可选的,因为枚举有 3 种不同的选择,其中一个答案可能不是正确的答案。话虽如此,如果我没有使初始化程序可选,那将是一个错误。但是在你问了这个问题之后,我认为这些对象不必是可选的。
  • 简单规则:如果您编写了一个必需的初始化程序,传递非可选参数,请使用非可选属性。
  • 瓦迪安明白了,非常感谢。

标签: swift class inheritance init


【解决方案1】:

您忘记将texturesole 参数添加到Nike.init。此外,您需要将参数传递给您当前编写Conditionsuper.init。试试这个:

class Nike: Shoe {
    var texture: Condition?
    var sole: Condition?

    override init(color: Condition, laces: Condition, texture: Condition, sole: Condition) {
        self.texture = texture
        self.sole = sole
        super init(color: color, laces: laces)
    }
}

【讨论】:

  • 如果我不希望我的子类继承超类中选择的条件,这是一个问题。我希望子类具有相同的变量,但我希望应用程序的用户能够选择条件。所以我使用类继承是因为 DRY
  • 您正在初始化所有属性。它们使用您传递给 super 的值进行初始化。它们也是 var 属性,所以你可以在初始化后修改它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多