【问题标题】:Get specific attribute of object from a variable in Swiftui从 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]

错误:但是玩家作为没有成员排名选择。

我应该如何从变量中获取特定属性?

【问题讨论】:

    标签: arrays swift object foreach swiftui


    【解决方案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 版本。然后所有的关键路径都可以引用属性的字符串版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多