Trim 匹配两个字符串后的数组

Trim array after matching two strings

我想知道如何通过匹配两个字符串来 trim 数组。有一个大数组,我必须通过匹配起始字符串和结束字符串来 trim 该数组。

我有这个数组。

var timeArray = ["1AM",  "2AM",  "3AM",  "4AM",  "5AM",  "6AM", "7AM",
                 "8AM",  "9AM",  "10AM", "11AM", "12PM", "1PM", "2PM",
                 "3PM",  "4PM",  "5PM",  "6PM",  "7PM",  "8PM", "9PM", 
                 "10PM", "11PM", "12AM"]

我得到两个字符串,即 Opening HourClosing Hour。这些值是从 PickerView 中选取的,我需要 trim 根据营业时间和营业时间来排列数组。

假设我从选择器视图中得到“6AM”作为开放时间,“10PM”作为关闭时间,那么我的新数组应该是

var newtimeArray = ["6AM", "7AM", "8AM", "9AM", "10AM", "11AM", "12PM",
                    "1PM", "2PM", "3PM", "4PM", "5PM",  "6PM",  "7PM", 
                    "8PM", "9PM", "10PM"]

执行此操作的好方法是什么。实际上我需要这些新数组显示在 table 视图的单元格中。 table 视图中的单元格数量取决于这些新数组。

firstIndex(of:)求开盘和收盘时间的索引,然后用这些索引求原数组的子数组构造答案:

func makeTimeArray(open: String, close: String) -> [String] {
    let timeArray = ["1AM", "2AM", "3AM", "4AM", "5AM", "6AM", "7AM", "8AM", "9AM", "10AM", "11AM", "12PM", "1PM", "2PM", "3PM", "4PM", "5PM", "6PM", "7PM", "8PM", "9PM","10PM", "11PM", "12AM"]

    guard let openIdx = timeArray.firstIndex(of: open),
          let closeIdx = timeArray.firstIndex(of: close)
        else { return [] }

    if openIdx <= closeIdx {
        // straightforward case
        return Array(timeArray[openIdx...closeIdx])
    } else {
        // handle wraps past midnight
        return Array(timeArray[openIdx...] + timeArray[...closeIdx])
    }
}

示例:

print(makeTimeArray(open: "8PM", close: "2AM"))
["8PM", "9PM", "10PM", "11PM", "12AM", "1AM", "2AM"]
print(makeTimeArray(open: "2PM", close: "2PM"))
["2PM"]
print(makeTimeArray(open: "8AM", close: "2PM"))
["8AM", "9AM", "10AM", "11AM", "12PM", "1PM", "2PM"]
print(makeTimeArray(open: "13AM", close: "8PM"))
[]