【问题标题】:swift - days of the week from 8 bit dataswift - 来自 8 位数据的一周中的几天
【发布时间】:2018-07-24 14:33:12
【问题描述】:

从下面的 8 位,我想了解哪些日子是活跃的。 但是我想不出一个合适的解决方案。

0b00101101
   |     |
   |     Monday
   Sunday

我尝试的是:

func getWorkingDays(_ value: Data?) -> String? {
    guard let value = value else { return nil }
    if value.count == 1 {
        let days = calculateDays(value[0])
        return days
    }
    return nil
}

func calculateDays(_ days: UInt8?) -> String? {
        switch days {
        case 1:
            return "Monday"
        case 2:
            return "Tuesday"
        case 3:
            return "Monday, Tuesday"
        case 4:
            return "Wednesday"
        ......
}

【问题讨论】:

  • stackoverflow.com/questions/24112347/… ?如果您正在寻找其他答案,一些有趣的关键字:位、字段、标志、枚举...
  • 您可以将日期声明为自己的二进制值。例如let monday = 0b00000001 然后if( (days | monday) == days) { // monday is on

标签: swift


【解决方案1】:

你想看看使用OptionSet

您使用OptionSet 协议来表示位集类型,其中各个位表示集合的成员。

在你的情况下,它看起来像这样。

struct Weekdays: OptionSet {
    let rawValue: Int

    static let monday    = Weekdays(rawValue: 1 << 0)
    static let tuesday   = Weekdays(rawValue: 1 << 1)
    static let wednesday = Weekdays(rawValue: 1 << 2)
    static let thrusday  = Weekdays(rawValue: 1 << 3)
    static let friday    = Weekdays(rawValue: 1 << 4)
    static let saturday  = Weekdays(rawValue: 1 << 5)
    static let sunday    = Weekdays(rawValue: 1 << 6)
}

然后从Int 转换为Weekdays 你这样做

let data = 0b00101101
let weekdays = Weekdays(rawValue: data)

并检查它是否包含您所做的某一天或多天

if weekdays.contains(.monday) {
    print("It's monday!")
}

【讨论】:

  • 谢谢,我会阅读更多关于 OptionSets 的内容。 @vadian 的答案对我的水平来说更容易理解
【解决方案2】:

简单的解决方案,它将位按位向右移动,屏蔽除最右边之外的所有位并检查它是 1 还是 0,然后通过循环索引从数组中获取工作日名称。

例如

i = 00b00101101 → 索引 0(星期一)。
i = 10b00010110
i = 20b00001011 → 索引 2(星期三)

等等


let weekdays = Calendar.current.weekdaySymbols // starts with `Sunday` will be adjusted with (i+1)%7

let activeDays = 0b00101101

var activeWeekdays = [String]()
for i in 0..<7 {
    if activeDays >> i & 0x1 == 1 { activeWeekdays.append(weekdays[(i + 1) % 7]) }
}
print(activeWeekdays) // ["Monday", "Wednesday", "Thursday", "Saturday"]

【讨论】:

  • 仅供参考 - 不要硬编码工作日名称。可以使用Calendar.current.weekdaySymbols 获得正确本地化的工作日名称
  • @rmaddy 是的,但为此目的,weekdaySymbols 的顺序错误(从星期日开始)。
  • 这很容易调整。
  • @rmaddy 好的,同意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
相关资源
最近更新 更多