我刚刚开始学习Swift并尝试为iOS分配作业。
我所拥有的是4类关键字,例如:
CategoryX: hello, bye, good, bad
CategoryY: rain, sun
CategoryZ: sun, hello, what, rain
CategoryV: yes, no, bad, music, song, note
我想要的是将这些类别相互比较,结果将为我提供所选类别中的关键字。
例如,如果我选择比较所有类别,则结果将为:null (因为没有关键字显示在所有类别中)
但是如果我选择X和Z,那么结果将是:你好
如果Y和Z分别是:阳光,雨水
我并没有要求任何人给我写代码(但是,如果有人给我一个领先的机会,ofc会很好),我只想对如何处理这个问题以及如何正确使用它做一点解释方式,有人可以照亮吗?
谢谢
答案 0 :(得分:6)
我并没有要求任何人给我写代码(但是,如果有人给我一个领先的机会,ofc会很好),我只想对如何处理这个问题以及如何正确使用它做一点解释方式,有人可以照亮吗?
好的,在没有给出答案的情况下,以下是有关如何解决问题的提示。
这个作业不是让您考虑集合吗?还记得您在高中时制作的维恩图吗?还记得集合的 intersection 的想法吗?考虑一下。考虑一下集合。嗯... Swift有一个Set结构...
如果您遵循该想法,并研究Swift中的Set,那么您将看到要做什么。
答案 1 :(得分:1)
编写它很有趣,所以我将其发布在这里。如果您现在还没有完成,请查看结果并从中学习(我的座右铭)。
我希望您学习.forEach,.map,.filter,Guard Let和可选下标,因为您跳过了Sets的简单答案。哦,别忘了闭包以及它们如何被强烈捕获。
func compare(dicts: [[String]]) -> [String] {
var result = [String: Int]()
dicts.forEach { arg0 in
guard let priorResult = result[arg0.key] else {
result[arg0.key] = arg0.value
return
}
result[arg0.key] = priorResult + arg0.value
}
return result.filter{ arg0 in return arg0.value == dicts.count }.map{ return $0.key }
}
.map, forEach and .filter
调用给定闭包中集合中的每个项目(字典中的每个键值对)。
.map
返回map内部返回的数组。
.filter
返回一个数组,闭包为其返回true,因此过滤掉该闭包返回false的元素。
.forEach
是for循环的替代方法。
结果计算字符串的每次出现。
.filter对于每个字典中出现的字符串返回true。
.map将字典的键映射到简单的[String]数组。
答案 2 :(得分:0)
您可以尝试
let set1 = Set(["123","456","789"])
let set2 = Set(["123","456"])
let set3 = Set(["123"])
let res12 = set1.intersection(set2) // ["123","456"]
let res123 = set1.intersection(set2).intersection(set3) // ["123"]