如何列舉具有字串型別的列舉?


在 Swift 中,您可以使用 `.allCases` 屬性列舉所有符合 `CaseIterable` 協議的列舉 case。您將看到一個使用 `CaseIterable` 協議的示例,該協議可以幫助您迭代列舉的所有 case。使用 for-in 迴圈、reduce、filter 和 map 函式等不同的方法,您可以迭代列舉。

什麼是 CaseIterable 協議?

`CaseIterable` 是一個用於迭代列舉 case 的協議。它會自動為列舉合成所有 case。請記住,此協議不適用於關聯值的情況。此協議使您可以使用名為 `allCases` 的計算屬性訪問這些 case,該屬性返回集合陣列中的所有 case。

示例

例如,如果您有一個名為 `MyEnum` 的列舉,其中包含字串原始值:

enum MyEnum: String, CaseIterable {
   case case1
   case case2
   case case3
}

以下是一些關於如何在 Swift 中使用 `.allCases` 屬性列舉具有字串原始值的列舉的更多示例:

在本文中,我們將使用以下方法在 swift 中列舉具有字串型別的列舉:

  • 使用 for-in 迴圈

  • 使用 filter 函式查詢特定 case

  • 使用 map 函式建立原始值陣列

  • 使用 reduce 函式連線所有原始值

使用 for-in 迴圈

您可以使用 for-in 迴圈迭代列舉的 case。您可以使用列舉提供的 `allCases` 屬性迭代這些 case。

示例

enum MyEnum: String, CaseIterable {
   case case1 = "First case"
   case case2 = "Second case"
   case case3 = "Third case"
}
for item in MyEnum.allCases {
   print(item.rawValue)
}

輸出

First case
Second case
Third case

在上面的示例中,我們使用 `CaseIterable` 協議迭代列舉 case。使用 for-in 迴圈,以字串格式迭代 `allCases`。

使用 map 函式建立原始值陣列

您可以使用 map() 函式迭代列舉 case。

MyEnum.allCases.map { $0.rawValue }

示例

使用 map() 函式,您可以轉換列舉的 `rawValue` 的型別。

enum MyEnum: String, CaseIterable {
   case case1 = "First case"
   case case2 = "Second case"
   case case3 = "Third case"
}
let rawValues = MyEnum.allCases.map { $0.rawValue }
print(rawValues)

輸出

["First case", "Second case", "Third case"]

在上面的示例中,使用 map() 函式迭代 case。此外,我們還在 map() 函式的執行塊中返回每個 case 的 `rawValue`。

使用 filter 函式查詢特定 case

您可以使用 filter 函式在列舉中查詢特定 case。

MyEnum.allCases.filter { $0.rawValue == "Second case" }

在 Swift 中,您可以使用 filter 函式(高階函式)過濾您想要的 case。在上面的語法中,我們正在過濾與值“Second case”匹配的 case。此方法返回一個數組作為輸出。在這裡,您使用 `rawValue` 屬性,因為您需要與字串值匹配。

示例

enum MyEnum: String, CaseIterable {
   case case1 = "First case"
   case case2 = "Second case"
   case case3 = "Third case"
}
let filteredCases = MyEnum.allCases.filter { $0.rawValue == "Second case" }
print(filteredCases)

輸出

[main.MyEnum.case2]

在上面的示例中,使用 filter() 函式過濾與值“Second case”匹配的 case。此函式返回 Enum 型別的返回值。

使用 reduce 函式連線所有原始值

MyEnum.allCases.reduce("") { $0 + $1.rawValue + " " }

在 Swift 中,您可以使用 reduce(高階函式)函式將所有 case 連線到單個值。在上面的語法中,reduce 函式採用我們傳遞的空字串的初始值。在完成塊中,我們將每個 case 的 `rawValue` 附加到前一個值。

示例

enum MyEnum: String, CaseIterable {
   case case1 = "First case"
   case case2 = "Second case"
   case case3 = "Third case"
}
let concatenatedRawValues = MyEnum.allCases.reduce("") { $0 + $1.rawValue + " " }
print("Concatenated Raw Values:", concatenatedRawValues)

輸出

Concatenated Raw Values: First case Second case Third case 

在上面的示例中,我們將所有原始值連線起來以構成單個字串。

結論

Swift 的 `CaseIterable` 介面簡化了列舉所有沒有關聯值的列舉 case 的過程。透過遵守 `CaseIterable` 協議並使用 `allCases` 屬性,您可以訪問作為列舉型別集合的所有列舉 case。

您可以使用列舉提供的 `allCases` 屬性迭代列舉的所有 case。您可以過濾它們或對所有 case 執行任何其他操作。如果要轉換值型別,可以使用 map 函式轉換它們。在這種情況下,您必須使用 `rawValue` 屬性。

您應該注意,如果您對列舉 case 使用關聯值,則無法迭代 case。使用關聯值時,`CaseIterable` 協議不適用。

更新於:2023年2月28日

瀏覽量:695

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.