Swift:在数组中查找值并返回特定键

时间:2016-06-21 15:51:54

标签: arrays swift string dictionary search

我是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”的名字。 如何迭代我的集合并只获取键而不是字典中的值? 谢谢!

6 个答案:

答案 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)

使用reduce

map之后,filterflatMap这是我的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...
}