使用类作为Enum的RawValue无法正常工作

时间:2019-07-03 20:10:25

标签: ios swift xcode class enums

我试图将自定义类 ChallengeUIElement 用作枚举 ChallengeUIElementType 的rawValue。

因此,我尝试了Xcode想要我做的所有事情,但仍然出现错误消息。开始疼...

无论如何,我遵循了this教程,并得到了许多我不理解的错误消息。

谷歌搜索一段时间后,我发现了一些关于类作为枚举的rawValue类型的stack overflow entries

但是,我仍然无法使用类类型的枚举。

我的错误Errors

这是我的代码:

<head>
  <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
</head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>

<div id="app">
  <v-app id="inspire">
    <v-container grid-list-xl style="background: IndianRed;">
      <v-layout text-xs-center row wrap align-center style="height: 100px;">

        <v-flex xs4>
          <v-card color="success">
            Content
          </v-card>
        </v-flex>

<!–– This guy right here -->
        <v-flex xs4>
          <v-layout column align-center>
            <v-switch prepend-icon="cloud" v-model="enabled"></v-switch>
          </v-layout>
        </v-flex>

        <v-flex xs4>
          <v-card color="success">
            Content
          </v-card>
        </v-flex>

      </v-layout>
    </v-container>
  </v-app>
</div>

此外,我不明白为什么可以将RawRepresentable用作this approach的协议,而不能与this one一起使用?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您得到的错误主要与错误地声明初始化程序的方式有关。他们实际上与创建具有类原始值的枚举没有太大关系。

由于协议需要您的初始化程序,因此需要将其标记为required。如果您的班级是final,则无需执行此操作。因此,要么将类标记为final,要么将所有初始化程序标记为required

这两个便利初始化程序需要标记为convenience

public convenience init(unicodeScalarLiteral value: String) {
    self.init(stringLiteral: value)
}
public convenience init(extendedGraphemeClusterLiteral value: String) {
    self.init(stringLiteral: value)
}

这些是“便利”初始化程序,因为它们调用了类中声明的另一个初始化程序。

此外,public init(stringLiteral value: String)初始化程序不会初始化所有属性。想想如果if语句不运行会发生什么。您需要为属性(heightidentifiertype)提供一些默认值。