我是swift的新手,非常感谢你的帮助..
在我未来的项目中,我很乐意在数组中查找特定的字符串,并在其兴趣爱好阵列中获取仅返回具有此值的名称。
struct Person {
var name: String
var hobbies:Set <String>
}
var persons: [Person]
persons = [
Person(name: "Steve", hobbies: ["PC", "PS4", "Gaming", "Basketball"]),
Person(name: "Max", hobbies: ["Gaming", "Xbox", "cooking", "PC"]),
Person(name: "Julia", hobbies: ["Soccer", "Tennis", "cooking", "Painting"])
]
var StringToSearch = "PC"
我很想得到只有爱好“PC”的名字。 如何迭代我的集合并只获取键而不是字典中的值? 谢谢!
答案 0 :(得分:4)
使用flatMap
:
let result = persons.flatMap {
$0.hobbies.contains(StringToSearch) ? $0.name : nil
}
答案 1 :(得分:3)
filter(_:)
let stringToSearch = "PC"
let pcHobbiests = persons.filter { $0.hobbies.contains(stringToSearch) }
let pcHobbiestNames = persons.map { $0.name }
filter(_:)
将迭代Sequence
的元素,构建一个新的Array,其中只包含闭包计算结果为true的元素。在这个例子中,闭包检查当前迭代hobbies
的{{1}} Array
是否包含Person
。
然后,您可以迭代pcHobbiests数组或随意使用它们:
stringToSearch
答案 2 :(得分:3)
你可以使用filter + map返回所有拥有“PC”爱好的人的名字数组:
let nameArray = persons.filter{$0.hobbies.contains("PC")}.map{$0.name}
//return ["Steve", "Max"]
答案 3 :(得分:2)
map
之后,filter
和flatMap
这是我的reduce
解决方案:)
let names = persons.reduce([String]()) { (names, person) -> [String] in
guard person.hobbies.contains(keyword) else { return names }
return names + [person.name]
}
如果你真的想在一行写一切......
let names = persons.reduce([String]()) { $0.0 + ($0.1.hobbies.contains(keyword) ? [$0.1.name] : []) }
答案 4 :(得分:1)
使用Swift的for-in循环。
for pers in persons {
if pers.hobbies.contains(StringToSearch) {
nameOfPCGamer = pers.name
}
}
答案 5 :(得分:-2)
您可以使用循环,收集:
for p in persons {
if p.hobbies.contains("PC") {
// then you've got one!
}
}
或者您可以通过过滤数组来使用更通用的编程,从而获得过滤内容的数组并对其进行迭代:
for p in persons.filter({$0.hoobies.contains("PC")}) {
// got one...
}