从Swiftui中的变量获取对象的特定属性

问题描述

我想在我的RankView中创建一个列表,以显示玩家的排名。 可以在选择器中选择排名类型。玩家可以按最高分或尝试次数显示排名

let rankChoice = ["highscore","attempt"]
@State var listRank : [Player] = []
@State var selectedindex = 0 // gives selected index from Picker

玩家的定义如下:

Struct Player: Identifiable {
    var id = UUID
    let playerName : String
    let highscore : Int
    let attempt : Int
}

最后,我想显示一个列表,其中有player.playerName和(player.highscore或player.attempt),这取决于我在选择器中的用户选择。

List{
    ForEach(0 ..< listRank.count,id: \.self) { index in
        HStack{
            Text("\(listRank[index].playerName)")
            Spacer()
            Text(String(listRank[index].rankChoice[selectedindex]))
        }
    }
}

所以我想获取 listRank [index] .rankChoice [selectedindex]

错误:但是玩家没有成员RankChoice。

如何从变量中获取特定属性

解决方法

在Swift中,您无法通过字符串访问属性。

这是一种可能的解决方案:

List {
    ForEach(0 ..< listRank.count,id: \.self) { index in
        HStack {
            Text("\(listRank[index].playerName)")
            Spacer()
            if selectedIndex == 0 {
                Text(String(listRank[index].highScore))
            } else {
                Text(String(listRank[index].attempt))
            }
        }
    }

使用KeyPaths

如果您要显示的所有属性都具有相同的类型(例如Int),则KeyPath是一个很好的解决方案。

let rankChoice = [\Player.highscore,\Player.attempt]

然后:

Text(String(listRank[index][keyPath: rankChoice[selectedIndex]]))