声明无法标记为静态',为什么

时间:2017-09-15 14:19:12

标签: swift enums

我有一个School结构:

public structure School {
  ...
}

然后,我有一个扩展名,我在其中声明了一个静态枚举:

extension School {
  // Compiler error: Declaration cannot be marked 'static'
  static enum Level: String {
     case Middle = "middle"
  }
}

但是我在上面的评论中提到了编译器错误,如何在扩展中声明静态枚举呢?

3 个答案:

答案 0 :(得分:5)

enum是一种类型,因此无法标记为静态。即使您在类中声明了enum,也可以通过类类型而不是通过实例来访问它。在Swift中,static关键字可用于标记类型属性,但由于enum本身是一种类型,因此它不能是属性,因此无法标记为static

struct School {

}

extension School {
    enum Level: String {
        case Middle = "middle"
    }
}

您可以通过enum类型访问School,无需创建实例。

School.Level.Middle

答案 1 :(得分:1)

只能将类型的属性和方法标记为静态。 (Enum是类似struct的值类型)此外,如果你有一个具有静态方法或属性的类并且要求它被子类化,那么它应该被标记为class而不是static。

答案 2 :(得分:0)

在Java中,内部类型可以访问封闭类型的成员。 static关键字用于阻止此类访问,并指示该类型独立于其封闭类型的成员。

Swift从一开始就没有这样做,所以它不能用于static内部类型。