从 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 中的变量获取对象的特定属性的主要内容,如果未能解决你的问题,请参考以下文章

声明后不可访问的可观察对象中的变量(SwiftUI)

如何从 Java 中的 DynamoDB getItem 中获取特定属性值

SwiftUI 中的 CoreData:如何清楚地获取属性?

从对象获取属性值并将其分配给javascript中的变量

SwiftUI 从 URL 加载单个对象 JSON

SwiftUI - 将托管对象上下文传递给模型