swift 快速获取枚举中的所有项

ffscu2ro  于 2023-01-25  发布在  Swift
关注(0)|答案(1)|浏览(259)

我在枚举中有一些属性,我需要一个包含这些常量的数组来匹配字符串键。我需要自动地遍历它们。我不能更改输入,因为它已经生成了。

public enum Items {
    public static let a = Assets(named: "A")
    public static let b = Assets(named: "B")
    public static let c = Assets(named: "C")
    public static let d = Assets(named: "D")
    public static let e = Assets(named: "E")
}

我试过镜像他们。

uurv41yg

uurv41yg1#

如果你只是用枚举作为占位符来放置你的静态变量,这很简单,只要创建一个静态数组,里面有所有的属性。

struct Assets
{
    let name: String
    var assets: String { "assets for \(name)" }

    init(named: String)
    {
        self.name = named
    }
}

enum Items2 {
    static let a = Assets(named: "A")
    static let b = Assets(named: "B")
    static let c = Assets(named: "C")
    static let d = Assets(named: "D")
    static let e = Assets(named: "E")

    static var allItems: [Assets] { return [a, b, c, d, e] }
}

for item in Items2.allItems
{
    print(item.assets)
}

但是,如果您担心可能忘记向数组中添加新属性,则可以正确使用枚举。使用rawValueString且符合CaseIterable的枚举,并定义所有事例。然后添加一个属性,该属性基于事例的rawValue获取Assets。然后,您可以使用枚举的allCases属性获取所有事例。

enum Items: String, CaseIterable
{
    case a = "A"
    case b = "B"
    case c = "C"
    case d = "D"
    case e = "E"

    var assets: Assets { Assets(named: rawValue) }

    static var allItems: [Assets] { allCases.map{ $0.assets } }

}

for item in Items.allItems
{
    print(item.assets)
}

CaseIterable枚举具有自动合成的allCases属性。如果添加新大小写,则它将自动合成为allCases

相关问题