【问题标题】:Question about day repeat function in iPhone alarm app in Swift关于 Swift 中 iPhone 闹钟应用程序中的日重复功能的问题
【发布时间】:2019-11-08 02:35:55
【问题描述】:

我正在实现 iPhone 闹钟应用的日间重复功能。

我想使用 Bitmask 设置星期一 (1)、星期二 (2)、星期三 (4)、星期四 (8)、星期五 (16)、星期六 (32)、星期日 (64) 和星期几.

当我使用这种方法时,我得到了 0 ~ 127、128 天设置的组合。

fileprivate func convertSchedule(_ schedule: Int) -> String {
        switch schedule {
        case 0: return "none"
        case 1: return "Every Monday"
        case 2: return "Every Tuesday"
        case 3: return "mon,tue"
        case 4: return "Every Wednesday"
        case 5: return "mon,wed"
        case 6: return "tue,wed"
        default: break
        }
        return ""
}

此代码将 0 到 127 之间的数字转换为星期几字符串。我觉得把128个case都写在代码里效率太低了。

你能让这个函数简单吗? 而不是编码所有 128 个案例,

【问题讨论】:

  • 首先,您需要确定转换后的字符串是如何创建的(考虑边缘情况)。然后,您可以使用按位运算符来确定安排了哪些日期并基于此构造字符串。绝对不要创建 128 个案例语句!

标签: ios swift


【解决方案1】:

您在位掩码的正确轨道上。您可以从计划中提取要重复的天数,然后根据天数构造字符串。例如,你可以参考下面我的例子:

struct WeekDay {
  let rawValue: Int
  let name: String

  static let mon = WeekDay(rawValue: 1, name: "Monday")
  static let tue = WeekDay(rawValue: 1<<1, name: "Tuesday")
  static let wed = WeekDay(rawValue: 1<<2, name: "Wednesday")
  static let thu = WeekDay(rawValue: 1<<3, name: "Thursday")
  static let fri = WeekDay(rawValue: 1<<4, name: "Friday")
  static let sat = WeekDay(rawValue: 1<<5, name: "Saturday")
  static let sun = WeekDay(rawValue: 1<<6, name: "Sunday")

  static let all: [WeekDay] = [.mon, .tue, .wed, .thu, .fri, .sat, .sun]
  func isIncluded(in schedule: Int) -> Bool {
    return schedule & rawValue == rawValue
  }
}

fileprivate func convertSchedule(_ schedule: Int) -> String {
  var daysToRepeat = WeekDay.all.filter({ $0.isIncluded(in: schedule) })

  if daysToRepeat.count == 0 {
    return "none"
  } else if daysToRepeat.count == 1 {
    return "Every \(daysToRepeat[0].name)"
  } else {
    return daysToRepeat.map({ $0.name }).joined(separator: ",")
  }
}

【讨论】:

  • 使用OptionSet 可能会更干净。
  • 我知道,但最好将name 作为模型的属性。使用 optionSet 将使计算的 var name 非常复杂。无论如何,我认为结构在这里仍然可以很好地工作。如果您对 optionSet 有任何解决方案,请发布。我想知道
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多