循环检查多个数组中的匹配



我有7个Strings数组。

var redArray : [String] = ["2022-07-13", "2022-07-14","2022-07-15"]
var blueArray : [String] = ["2022-07-13", "2022-07-14","2022-07-16"]
...
And five more of the same format

我试图创建一个方法,将通过七个数组和工作像下面一个(下面的例子适用于两个数组):

if redArray.contains(someDate) && blueArray.contains(someDate)
{
return [UIColor.red, UIColor.blue]
}
else

if redArray.contains(someDate)
{
return [UIColor.red]
}
else if blueArray.contains(someDate)
{
return [UIColor.blue]
}
return [UIColor.clear]

所以它应该在数组中找到日期的匹配,并返回具有此匹配的数组的UIColor。如果没有匹配,应退回单色。对于两个数组,这样做很容易。但是我不明白我怎么能遍历其中的7个:

当然,它可以手工完成。但我想一定有一个聪明的方法来实现loop-虽然我不够聪明,弄清楚如何。

注:我不知道,如果它是重要的,但function将使用此方法如下:

func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance,eventDefaultColorsFor date: Date) -> [UIColor]?
{
...
}

你可以这样做:

var colors: [UIColor] = []
if redArray.contains(someData) {
colors.append(.red)
}
if blueArray.contains(someData) {
colors.append(.blue)
}
if greenArray.contains(someData) {
colors.append(.green)
}
return colors.isEmpty ? [.clear] : colors

如果你真的需要循环,从:

开始
let tuples: [(UIColor, [String])] = [(.red, redArray), (.blue, blueArray), (.green, greenArray)]
var colors: [UIColor] = []

基本for循环:

for aTuple in tuples {
if aTuple.1.contains(someData) {
colors.append(aTuple.0)
}
}

基本for循环,where:

for aTuple in tuples where aTuple.1.contains(someData) {
colors.append(aTuple.0)
}

With aforEach:

tuples.forEach {
if $0.1.contains(someData) {
colors.append($0.0)
}
}

如果你喜欢reduced(into:_:):

let colors = tuples.reduce(into: [UIColor]()) { partialResult, current in
guard current.1.contains(someData) else { return }
partialResult.append(current.0)
}

最后还是return colors.isEmpty ? [.clear] : colors

编辑:正如评论中建议的那样,还有compactMap()解决方案。它可以看作是一个循环中的map()+filter()

let colors = tuples.compactMap { aTuple in
if aTuple.1.contains(someData) {
return aTuple.0
} else {
return nil
}
}

试试这个:

func loop(someDate: String, arrays: [([String], UIColor)]) -> [UIColor] {
let containingArrays = arrays.filter({$0.0.contains(someDate)})
return containingArrays.isEmpty ? [.clear]: containingArrays.map({$0.1})
}

用法:loop(someDate: "some Date", arrays: [(["Test1"], .red), (["Test2"], .blue)])

相关内容

  • 没有找到相关文章

最新更新