Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
86 views
in Technique[技术] by (71.8m points)

ios - Swift: How to assign a value to a variable inside an array?

I Have had quite some trouble with what is likely a beginners question in Swift:

I am trying to save some high scores to variables that I want to permanently save - based on the selected game type and game difficulty.

Preferably this should be done using a loop since in my actual code there will be many different game/difficulty combinations, so an if statement would get quite large. What I tried to do looks somewhat like this (the part where I don't know what to do is marked with a comment):

var hiScoreEasyA = 0
var hiScoreHardA = 0
var hiScoreEasyB = 0
var hiScoreHardB = 0

var currentGame = "A"
var currentDifficulty = "Easy"

var currentScore = "9999"

var newHiScore = false

func setHiScore() -> Void {
    var hiScores: [[Any]] = [
        ["A", "Easy", hiScoreEasyA],
        ["A", "Hard", hiScoreHardA],
        ["B", "Easy", hiScoreEasyB],
        ["B", "Hard", hiScoreHardB]   
    ]

    for hi in hiScores.indices {
        if (hiScores[hi][0] as! String) == currentGame && (hiScores[hi][1] as! String) == currentDifficulty {
            if (hiScores[hi][2] as! Int) < currentScore {
                newHiScore = true
                //Here I would need to assign the value of currentScore to the variable stored in hiScores[hi][2] (hiScoreEasyA)
            }
        }
    }
}

The code seems to work so far but I have not found any practical way to assign the current score to the correct high score variable.

Any ideas how to tackle this? I'd appreciate the help.

question from:https://stackoverflow.com/questions/65858317/swift-how-to-assign-a-value-to-a-variable-inside-an-array

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You are on the wrong path. If your game has many difficulties and game types, then you should get rid of these variables:

var hiScoreEasyA = 0
var hiScoreHardA = 0
var hiScoreEasyB = 0
var hiScoreHardB = 0

and replace them with a dictionary that maps each high score category to the high score. A "high score category" is simply a difficulty and a game type combined, e.g. "easy A", "hard B":

struct HighscoreCategory: Hashable {
    let difficulty: String
    let gameType: String
}

The dictionary looks like this:

var highScores = [
    HighscoreCategory(difficulty: "Easy", gameType: "A"): 0,
    HighscoreCategory(difficulty: "Hard", gameType: "A"): 0,
    HighscoreCategory(difficulty: "Easy", gameType: "B"): 0,
    HighscoreCategory(difficulty: "Hard", gameType: "B"): 0,
]

Now to set the high score of the current game type and difficulty, you don't need any loops at all! You just do

func setHiScore() -> Void {
    let highScoreCategory = HighscoreCategory(difficulty: currentDifficulty, gameType: currentGame)
    let previousHighscore = highScores[highScoreCategory] ?? 0
    if previousHighscore < currentScore {
        newHiScore = true
        highScores[highScoreCategory] = currentScore // this is the line where you set it
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...