如何在Swift中获取枚举值的名称?


在Swift中,你可以遵循`CustomStringConvertible`协议来为枚举中的每个情况提供默认名称。此协议可用于根据需要提供自定义含义。

CustomStringConvertible

CustomStringConvertible是Swift中的一个协议,它定义了一个单一属性`description`,该属性返回符合类型的实例的字符串表示形式。通过遵循`CustomStringConvertible`,你可以自定义在打印、记录或以其他方式转换为字符串时类型的字符串表示方式。

当你遵循`CustomStringConvertible`时,你可以通过实现`description`属性来定义你的类型实例如何表示为字符串。`description`属性返回一个字符串,该字符串以人类可读的格式表示实例的内容。默认情况下,`description`属性返回类型的名称,但你可以通过提供你的实现来自定义它。

示例 1

以下是如何将`CustomStringConvertible`与枚举一起使用的示例:

enum Direction: CustomStringConvertible {
   case north
   case south
   case east
   case west
    
   var description: String {
      switch self {
         case .north:
            return "North"
         case .south:
            return "South"
         case .east:
            return "East"
         case .west:
            return "West"
      }
   }
}
let direction = Direction.north
print("The direction is \(direction)")

输出

The direction is North

在上面的示例中,我们定义了一个名为`Direction`的枚举,它有四个情况:north、south、east和west。我们还声明`Direction`遵循`CustomStringConvertible`协议。

然后,我们实现了`description`属性,它返回枚举值的字符串表示形式。在`description`属性的实现中,我们使用switch语句根据枚举情况返回相应的字符串值。

最后,我们创建了一个名为`direction`的`Direction`类型变量,并将其设置为`Direction.north`。我们使用字符串插值来打印包含`direction`值的消息。由于`Direction`遵循`CustomStringConvertible`,因此将使用`description`属性将`Direction`枚举值转换为字符串表示形式,在本例中为“North”。此字符串将包含在打印的消息中。

你可以使用相同的方法来自定义遵循`CustomStringConvertible`协议的任何枚举值的字符串表示形式。

示例 2

以下是如何将`CustomStringConvertible`与网络错误代码枚举一起使用的示例:

enum NetworkErrorCode: Int, CustomStringConvertible {
   case noInternet = -1009
   case timeout = -1001
   case badRequest = 400
   case unauthorized = 401
   case forbidden = 403
   case notFound = 404
    
   var description: String {
      switch self {
         case .noInternet:
            return "No Internet Connection"
         case .timeout:
            return "Request Timed Out"
         case .badRequest:
            return "Bad Request"
         case .unauthorized:
            return "Unauthorized"
         case .forbidden:
            return "Forbidden"
         case .notFound:
            return "Resource Not Found"
      }
   }   
   var code: Int {
      return self.rawValue
   }
}
let error = NetworkErrorCode.timeout
print("Error: \(error.code) - \(error)")

输出

Error: -1001 - Request Timed Out

在上面的示例中,我们定义了一个名为`NetworkErrorCode`的枚举,它表示不同类型的网络错误。枚举的每个情况都有一个对应的整数值,表示错误代码。

我们还声明`NetworkErrorCode`遵循`CustomStringConvertible`协议。我们实现了`description`属性,它返回一个描述枚举情况所表示的错误的字符串。

我们还定义了一个计算属性`code`,它返回枚举情况的整数值。

最后,我们创建了一个名为`error`的`NetworkErrorCode`类型变量,并将其设置为`.timeout`。我们使用字符串插值来打印包含错误代码和错误描述的消息。

由于`NetworkErrorCode`遵循`CustomStringConvertible`,因此将使用`description`属性将枚举值转换为字符串表示形式,在本例中为“Request Timed Out”。输出将为“Error: -1001 - Request Timed Out”。

以这种方式使用`CustomStringConvertible`允许我们创建更用户友好的网络错误代码表示形式,可在日志、错误消息和其他类型的输出中使用。

结论

总之,`CustomStringConvertible`是Swift中的一个协议,允许我们自定义类型的字符串表示形式。通过遵循此协议,我们可以定义一个`description`属性,该属性返回一个字符串,以人类可读的格式表示类型的值。

这对于创建自定义错误类型或枚举值特别有用,在这些情况下,我们希望提供更具描述性的错误消息,或者在输出到控制台或日志时使值更易于用户理解。通过提供自定义字符串表示形式,我们可以使开发人员更容易理解代码中发生的情况,并使用户更容易理解应用程序中发生的情况。

更新于:2023年5月4日

67 次查看

启动你的职业生涯

完成课程获得认证

开始
广告