微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从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]]))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。