Swift: How to access a Switch Statement in a Swift file (error: Statements are not allowed at the top level)?

Swift: How to access a Switch Statement in a Swift file (error: Statements are not allowed at the top level)?

我对 Swift 和一般编码还是陌生,我正在尝试为用户创建某种选项来更改彩色主题。

但我对如何访问swift文件中的switch语句(或如何封装它)以及如何访问set变量一无所知?

到目前为止,我让用户在设置视图控制器中选择一个主题,主题名称保存在 UserDefaults 中的键 "theme"。

在名为 themes.swift 的文件中,我创建了一个 switch 语句来检查名称。每个案例显然都可以设置我在 switch 语句上方声明的几个变量。

但我得到的错误是 "Statements are not allowed at the top level"?

我该如何解决这个问题? 我该怎么做才能让 switch 语句 运行 每次呈现视图控制器时检查正确的颜色,或者在选择新主题并设置变量后让它 运行 ?我理解错误信息,但我不知道如何解决这个问题。

例如,到目前为止我是这样设置 themes.swift 文件的:

import UIKit

var theme = UserDefaults.standard.string(forKey: "themes")

var background: UIColor?
var labelColor: UIColor?
var buttonColor: UIColor?


switch theme {
    case "Red":
        background = UIColor(named: "darkRed")
        labelColor = UIColor(named: "labelRed")
        buttonColor = UIColor(named: "buttonRed")
    case "Blue":
        background = UIColor(named: "darkBlue")
        labelColor = UIColor(named: "labelBlue")
        buttonColor = UIColor(named: "buttonBlue")
    default:
        return
}

那么我怎样才能访问这些变量呢?

除了顶级错误之外,我是否可以像通常那样访问变量,因为它们是全局变量?

例如。 startButton.setTitleColor(buttonColor, for: .normal) ?

您收到此错误是因为您的 switch 语句位于某些 class 或结构中(不清楚您在哪里实现了此代码)。要修复您的错误,您需要将该开关放在一个函数中。或许您可以创建一个名为 setTheme 的函数,如下所示:

var theme = UserDefaults.standard.string(forKey: "themes")

var background: UIColor?
var labelColor: UIColor?
var buttonColor: UIColor?

func setTheme() {
  //First, check to make sure theme is not nil
  guard let theme = self.theme else { return }
  switch theme {
  case "Red":
    background = UIColor(named: "darkRed")
    labelColor = UIColor(named: "labelRed")
    buttonColor = UIColor(named: "buttonRed")
  case "Blue":
    background = UIColor(named: "darkBlue")
    labelColor = UIColor(named: "labelBlue")
    buttonColor = UIColor(named: "buttonBlue")
  default:
    return
  }
}

另一种选择是使您的 UIColor? 属性成为计算变量。例如:

var background: UIColor? {
  guard let theme = self.theme else { return nil }
  switch theme {
    case "Red": return UIColor(named: "darkRed")
    case "Blue": return UIColor(named: "darkBlue")
    default: return nil
  }
}