从 Swiftui 中的变量获取对象的特定属性
Posted
技术标签:
【中文标题】从 Swiftui 中的变量获取对象的特定属性【英文标题】:Get specific attribute of object from a variable in Swiftui 【发布时间】:2020-10-27 11:30:57 【问题描述】:我想在我的 RankingView 中创建一个列表,以显示我的玩家排名。 可以在选择器中选择排名类型。玩家可以通过高分或尝试次数来显示排名
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 OR 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]
错误:但是玩家作为没有成员排名选择。
我应该如何从变量中获取特定属性?
【问题讨论】:
【参考方案1】:在 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
),那么 KeyPaths 是一个很好的解决方案。
let rankChoice = [\Player.highscore, \Player.attempt]
然后:
Text(String(listRank[index][keyPath: rankChoice[selectedIndex]]))
【讨论】:
感谢您的回答,我减少了问题的代码,但是 Player 有多个属性...(我为问题删除了)以使其更易于理解。你的答案有效,但我在想一些更短的东西...... 感谢您的快速回答!我的等级选择有不同的类型,但那是 Int 和 Int32,所以一切都将是 Int32 如果您的所有属性都没有相同的类型,您可以在结构中使用计算变量来公开相同的类型。例如,您可以通过添加诸如var highscoreStr: String String(highscore)
之类的计算属性来获得每个属性的String
版本。然后所有的关键路径都可以引用属性的字符串版本。以上是关于从 Swiftui 中的变量获取对象的特定属性的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Java 中的 DynamoDB getItem 中获取特定属性值