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跳转(推荐)
- 先在Storyboard中从最后一题的ViewController分别拖拽segue到4个国家对应的结果页,给每个segue设置唯一标识,比如英国的segueID设为
showUKResult、希腊的设为showGreeceResult,以此类推。 - 答题结束的逻辑代码:
// 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
相关产品推荐
相关产品推荐

