【问题标题】:Swift: How to access a Switch Statement in a Swift file (error: Statements are not allowed at the top level)?Swift:如何访问 Swift 文件中的 Switch 语句(错误:顶层不允许使用语句)?
【发布时间】:2018-01-22 19:27:59
【问题描述】:

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

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

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

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

但我收到“不允许在顶层声明”的错误?

我该如何解决这个问题? 我可以做些什么来让 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)?

【问题讨论】:

  • 代码需要在函数中。
  • 阅读错误信息。很清楚。
  • 正如 maddy 所说,switch 语句是必须在函数中才能执行的代码。这可能是您深入研究枚举的好时机。您可以在这里声明一个主题的枚举,然后添加派生值(枚举中内置的函数)以返回主题属性。

标签: swift switch-statement toplevel


【解决方案1】:

您收到此错误是因为您的 switch 语句只是位于某个类或结构中(不清楚您在哪里实现了此代码)。要修复您的错误,您需要将该开关放在一个函数中。也许您可以创建一个名为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
  }
}

【讨论】:

  • 感谢您的帮助。我已经在处理这个问题,但我收到错误消息:“'String' 类型的表达式模式无法匹配'String' 类型的值?” - 当我使用 self.theme 时,我收到错误消息:“使用未解析的标识符'自己'”?可能是什么问题?
  • 好的,@RjC,所以你得到了 2 个错误。第一个发生是因为 theme 是可选的(它可以是 nil),所以为了让你的 switch 语句正常工作,你需要先解开那个可选的。我使用guard 语句编辑了我的示例以展示一种方法。
  • @RjC 第二个错误是因为您似乎在任何类或结构中都没有此代码。你在哪里实施这个?如果您在类文件、UIViewController 类之一或AppDelegate 中实现了它,您将停止收到无法识别self 的错误。或者,如果您不打算将其放入类或结构中,则可以将 self 部分放在外面 - 我只是假设这将放入类或结构中。
  • 感谢您的回答。我让它可以将主题变量转换为字符串:var theme: String = UserDefaults.standard.object(forKey: "Themes") as! String - 我不知道这是否是正确的方法或者是否有更简单的方法,但它工作得很好,没有任何错误。
  • 这个没问题,但是如果UserDefaults中没有保存字符串会崩溃。最好使用 nil-coalescing 运算符充当“默认”值。例如,如果您希望“红色”作为用户的默认值,但没有设置不同的主题,您可以说 var theme = UserDefaults.standard.string(forKey: "Themes") ?? "Red" 这将使它成为 String 而不是 String?,并将分配默认值如果没有找到其他值,则为“红色”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多