【问题标题】:Swift - Use an enum to map UISegmentedControlSwift - 使用枚举映射 UISegmentedControl
【发布时间】:2018-05-03 21:58:13
【问题描述】:

使用代表秒 60、30 和 15 的三位分段控件。枚举的代码:

enum RefreshRate: Int {
    case sixty = 0
    case thirty
    case fifteen

    func refreshEvery() -> Double {
        switch self {
        case .sixty:    return 3600.0
        case .thirty:   return 1800.0
        case .fifteen:  return 900.0
        }
    }
}

类似:

let defaultValue = UserDefaults.standard.integer(forKey: "refreshRate")
let refreshInterval = RefreshRate(rawValue: defaultValue)?.refreshEvery()

效果很好。

在枚举的第一种情况下,是否有更“快捷”的方式来获取整数 60,而不使用函数或 switch 语句?

【问题讨论】:

  • 顺便说一句 - 这个问题与 UISegmentedController 有什么关系?
  • 即使这不是你要问的:refreshEvery 更快捷的方式是:var refreshInterval: Double { ... }
  • @rmaddy 如果有人想要存储分段控件的索引。您的回答提供了一个很好的选择。
  • 您的问题绝对没有提到您的枚举被用来表示分段控件的索引。那将是有用的信息。您的问题使它看起来仅用于确定与枚举案例相关的秒数。
  • @rmaddy 这就是为什么枚举的第一行是case sixty = 0。这将使三十 = 1 和十五 = 2。

标签: swift enums


【解决方案1】:

您可以使用 计算属性 来返回 refreshEvery 的值:

enum RefreshRate: Int {
    case sixty = 0
    case thirty
    case fifteen

    var refreshEvery: Double {
        return 60 * [60, 30, 15][self.rawValue]
    }
}

let rate = RefreshRate.sixty

print(rate.rawValue)     // 0
print(rate.refreshEvery) // 3600.0

【讨论】:

  • 这看起来像是一个中间解决方案。更简单,但仍然必须使用属性。我正在查看 case sixty = 60,将 rawValue 存储在用户默认值中并使用 UserDefaults.standard.integer(forKey: "refreshRate") 检索它。
  • 您将如何将其映射到分段控制索引?
  • 这是我的想法将崩溃的地方 - 你的答案是有效的。
猜你喜欢
  • 1970-01-01
  • 2016-06-09
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2017-03-03
相关资源
最近更新 更多