如何在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 次檢視

啟動你的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.