Swift:在子类中声明一个常量但仍然在超类中引用它?

时间:2015-06-03 15:56:19

标签: ios swift constants subclass superclass

让我们说你有Apple的几个子类。

class Apple {
  let color = ""
}

class redDelicious :Apple {
  let color = "Red"
}

class grannySmith :Apple {
  let color = "Green"
}

func eatApple (appleToEat: Apple)
{
  if appleToEat.color == "Red" {
    //do something
  } else if appleToEat.color == "Green"
  {
    //do something else
  }
}

问题在于,swift不会让我称之为"颜色"属性,但我想确保在子类中定义。我还想确保每个苹果都有颜色,这样我就可以在Apple的每个sublcass上调用颜色属性。在这种情况下,最好的解决方案是什么?

1 个答案:

答案 0 :(得分:3)

你可以这样做:

class Apple {
    let color: String
    init(color: String) {
        self.color = color
    }
}

class RedDelicious: Apple {
    init() {
        super.init(color: "Red")
    }
}

或者,您可以使用只读计算属性:

class Apple {
    var color: String { return "" }
}

class RedDelicious: Apple {
    override var color: String { return "Red" }
}

如果color只能是特定值,则可能值得使用枚举,例如:

class Apple {
    enum Color {
        case Red, Green
    }

    let color: Color
    init(color: Color) {
        self.color = color
    }
}

class RedDelicious: Apple {
    init() {
        super.init(color: .Red)
    }
}

eatApple函数中,您可以执行以下操作:

func eatApple (appleToEat apple: Apple) {
    switch apple.color {
        case .Red  : // ...
        case .Green: // ... 
    }
}