You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift如何获取最高整型分数对应的国家字符串并跳转视图控制器

第一步:优化分数管理逻辑(替换原有代码)

原有全局变量容易出现状态混乱,改用单例统一管理全App的分数数据,适配15个ViewController共用分数的需求:

import Foundation

struct QuizScore {
    // 全局唯一实例,所有页面共用同一份分数
    static let shared = QuizScore()
    
    // 分数变量收进结构体避免全局污染
    private var ukScore = 0
    private var greeceScore = 0
    private var italyScore = 0
    private var austriaScore = 0
    
    // 对外只读的获胜国家参数
    private(set) var finalCountry = ""
    
    // 私有初始化禁止外部创建额外实例
    private init() {}
    
     func ukScoreIncrement() {
        ukScore += 1
    }
    
     func greeceScoreIncrement() {
        greeceScore += 1
    }
    
     func italyScoreIncrement() {
        italyScore += 1
    }
    
     func austriaScoreIncrement() {
        austriaScore += 1
    }
    
    // 修改结构体属性需要加mutating标记
    mutating func getFinalScore(){
        let maxScore = max(ukScore, greeceScore, italyScore, austriaScore)
        switch maxScore {
        case ukScore: finalCountry = "Uk"
        case greeceScore: finalCountry = "greece"
        case italyScore: finalCountry = "italy"
        case austriaScore: finalCountry = "austria"
        default: break // 可自行扩展平局的处理逻辑
        }
    }
    
    // 可选:重玩Quiz时调用重置所有分数
    mutating func resetScores() {
        ukScore = 0
        greeceScore = 0
        italyScore = 0
        austriaScore = 0
        finalCountry = ""
    }
}

所有ViewController的国家按钮点击事件直接调用单例对应方法即可,比如英国按钮点击逻辑:

@IBAction func ukButtonTapped(_ sender: UIButton) {
    QuizScore.shared.ukScoreIncrement()
    // 保留原有跳转下一题的逻辑即可
}

第二步:配置结果页接收参数

在每个国家对应的结果ViewController中,添加接收获胜国家的属性:

class CountryResultViewController: UIViewController {
    // 接收传入的获胜国家参数
    var winningCountry: String!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 拿到winningCountry后即可做对应UI展示、逻辑处理
    }
}

第三步:答题结束后跳转传值

在最后一道题的ViewController中,用户答完题触发结束逻辑时按以下方式实现:

方式1:通过Storyboard Segue跳转(推荐)

  1. 先在Storyboard中从最后一题的ViewController分别拖拽segue到4个国家对应的结果页,给每个segue设置唯一标识,比如英国的segueID设为showUKResult、希腊的设为showGreeceResult,以此类推。
  2. 答题结束的逻辑代码:
// 1. 计算获胜国家
var scoreManager = QuizScore.shared
scoreManager.getFinalScore()
let winner = scoreManager.finalCountry

// 2. 按获胜国家触发对应segue
switch winner {
case "Uk": performSegue(withIdentifier: "showUKResult", sender: self)
case "greece": performSegue(withIdentifier: "showGreeceResult", sender: self)
case "italy": performSegue(withIdentifier: "showItalyResult", sender: self)
case "austria": performSegue(withIdentifier: "showAustriaResult", sender: self)
default: break
}

// 3. 重写prepare方法传值给结果页
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let resultVC = segue.destination as? CountryResultViewController else { return }
    resultVC.winningCountry = QuizScore.shared.finalCountry
}

方式2:纯代码跳转

如果不用Storyboard Segue,直接初始化结果页赋值后跳转即可:

var scoreManager = QuizScore.shared
scoreManager.getFinalScore()
let winner = scoreManager.finalCountry

let resultVC = CountryResultViewController()
resultVC.winningCountry = winner
// 模态跳转
present(resultVC, animated: true)
// 导航栏跳转替换为下行代码即可
// navigationController?.pushViewController(resultVC, animated: true)

内容的提问来源于stack exchange,提问作者Connar Mordelt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:57:03