arrays - 在 Swift 5 中,如何高效地提取和使用多维数组中的元素?

标签 arrays swift multidimensional-array time

编程新手,这是我使用 swift/xcode 的第五天,请善待。

我创建了一个格式为 [[A], [B], [C], [D], [E], [F]], ... 的数组作为查找表。要求是获取 A - AM/PM 和 B、C - 开始时间 并检查当前时间(小时、分钟)是否在 范围内D、E - 结束时间,如果是,则在 UILabel 上打印消息 F

例如,如果现在是凌晨 3.04,我的程序将使用下表来打印“去 sleep ,我会在凌晨 4 点通知您”

// [[A], [B], [C], [D], [E], [F]], ...


let messageArray : Array = [
                [["AM"], [00], [00], [00], [01], ["it's \nmidnight"]],
                [["AM"], [00], [02], [02], [59], ["it's very late (or early), \nto be up"]],
                [["AM"], [03], [00], [03], [01], ["are you ready \nfor the 03 am call?"]],
                [["AM"], [03], [02], [03], [59], ["go to sleep \ni'll let you know when it's \n4"]],...

我知道如何从当前时间获取小时和分钟。

let date = Date()
var calendar = Calendar.current

let hour = calendar.component(.hour, from: date)
let minute = calendar.component(.minute, from: date)

并且我需要一个外部和内部循环来遍历矩阵的每个 x, y。对于每个单元格,我需要提取数组并获取前 4 个元素 - AM/PM、startHour、startMinute、endHour、endMinute 来检查当前小时、分钟是否在这些范围内;但不确定我是否理解多维数组解析。我尝试过各种方法并尝试在网上查找,但我很挣扎。

我是否应该使用数组来实现此目的,还有其他更有效的数据结构吗?

任何帮助或建议将不胜感激。

谢谢

最佳答案

您可以创建自己的结构,如下所示:

enum AmPm {
    case am, pm
}
struct TimeMessage {
    var ampm: AmPm
    var hourStart: Int
    var minuteStart: Int
    var hourEnd: Int
    var minuteEnd: Int
    var message: String
}

具有一些方便的方法和属性:

extension TimeMessage {
    init(_ ampm: AmPm, _ hourStart: Int, _ minuteStart: Int, _ hourEnd: Int, _  minuteEnd: Int, _ message: String) {
        self.ampm = ampm
        self.hourStart = hourStart
        self.minuteStart = minuteStart
        self.hourEnd = hourEnd
        self.minuteEnd = minuteEnd
        self.message = message
    }
}

extension TimeMessage {
    var hourStart24: Int {
        switch ampm {
        case .am:
            return hourStart
        case .pm:
            return hourStart + 12
        }
    }

    var hourEnd24: Int {
        switch ampm {
        case .am:
            return hourEnd
        case .pm:
            return hourEnd + 12
        }
    }
}

extension TimeMessage {
    func matches(_ date: Date) -> Bool {
        let calendar = Calendar.current

        let hour = calendar.component(.hour, from: date)
        let minute = calendar.component(.minute, from: date)

        return (hourStart24, minuteStart) <= (hour, minute)
            && (hour, minute) <= (hourEnd24, minuteEnd)
    }
}

使用上面的结构,您可以将 messageArray 声明为:

let messageArray: [TimeMessage] = [
    TimeMessage(.am, 00, 00, 00, 01, "it's \nmidnight"),
    TimeMessage(.am, 00, 02, 02, 59, "it's very late (or early), \nto be up"),
    TimeMessage(.am, 03, 00, 03, 01, "are you ready \nfor the 03 am call?"),
    TimeMessage(.am, 03, 02, 03, 59, "go to sleep \ni'll let you know when it's \n4"),
    //...
]

并将其用作:

let now = Date()
if let timeMessage = messageArray.first(where: {$0.matches(now)}) {
    print(timeMessage.message)
} else {
    print("No match")
}

关于arrays - 在 Swift 5 中,如何高效地提取和使用多维数组中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61506783/

相关文章:

arrays - 以编程方式创建嵌套数组

c - 结构数组的排序成员

arrays - 在Scala中将两个数组与索引一起压缩?

c++ - 我可以将 QObject 数组的单个元素移动到另一个 QThread

swift - 如何在 Swift 应用程序中将操作链接到文件->保存/文件->打开

ios - 在 TableView 索引列表中显示整个字母表(横向)

ios - 将 UIImageView 添加到 UIScrollView

PHP多维排序?

java - java中的二维数组静态初始化

c++ - 移动指定索引处的数组元素