如何解决从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 举报,一经查实,本站将立刻删除。