用于闭包(虽然我认为它在其他地方也会有用),检查给定元素是否是列表成员(或任何字符是否为成员)的最简洁方法是什么?一个字符串)?
例如,要检查字符串"abcde"
是否包含"aeiou"
中的任何字符,或列表["bill", "sam" , "suzy"]
是否包含["abe", "bill", "charlie"]
中的任何名称?
答案 0 :(得分:2)
Swift数组内置了这个功能的功能。
我建议您从Apple查看official documentation for Collection Types作为起点。
以下是您的问题后面的示例:
// With [Character]
let vowels: [Character] = ["a", "e", "i", "o", "u"]
let chars: [Character] = ["a", "b", "c", "d", "e"]
let resultVowels = vowels.filter { chars.contains($0) }
resultVowels.count // == 2
resultVowels.description // == "[a, e]"
// With [String]
let people = ["Bill", "Sam", "Suzy"]
let peeps = ["Abe", "Bill", "Charlie"]
let resultPeople = people.filter { peeps.contains($0) }
resultPeople.count // == 1
resultPeople.description // == "[Bill]"
结果将是匹配的名称(或数字,字符等)。因此,您不仅可以获得计数,还可以获得此过程中的比较内容。只要类型遵循Equatable,这将适合您。 如果你想返回一个布尔值,只需:
return filteredArray.count != 0
现在,如果你想比较say,[Character]和String,那么:
let vowels: [Character] = ["a", "e", "i", "o", "u"]
let someString = "abcde"
let result = vowels.filter { someString.characters.contains($0) }
result.count // == 2
result.description // == "[a, e]"
String.characters属性是Swift 2引入的新功能。
我希望我能够帮助你。
答案 1 :(得分:2)
使用Set
结构:
let set0 = Set("abcde".characters)
let set1 = Set("aeiou".characters)
let intersection = set0.intersect(set1) // {"e", "a"}
同样,您可以找到2个字符串数组的交集:
let set0 : Set = ["bill", "sam", "suzy"]
let set1 : Set = ["abe", "bill", "charlie"]
let intersection = set0.intersect(set1) // {"bill"}
请注意,在这两个示例中,intersection
常量为Set
。您可以将其转换为数组写入:
let list = Array(intersection)
希望这有帮助。
P.S。此代码适用于Swift 2.0
更具体地说,如果你想知道是否存在交叉点,你可以简单地写:
!intersection.isEmpty