我有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)])