String 如何在Swift中返回所有子字符串(多次)?

String 如何在Swift中返回所有子字符串(多次)?,string,swift,substring,String,Swift,Substring,我有一个单词列表,我正试图将其匹配到Swift中的输入字符串中。例如,每当这些单词中的一个出现在字符串中时,我想打印它并将其添加到变量中。我已经能够确定这个词是否在句子中出现过一次,但不能确定它是否在字符串中出现过多次。这是我的密码 import Swift import Foundation var dictionary: [String] = ["blue", "red", "yellow", "green"] var count = dictionary.count var str

我有一个单词列表,我正试图将其匹配到Swift中的输入字符串中。例如,每当这些单词中的一个出现在字符串中时,我想打印它并将其添加到变量中。我已经能够确定这个词是否在句子中出现过一次,但不能确定它是否在字符串中出现过多次。这是我的密码

import Swift
import Foundation

var dictionary: [String] = 
["blue",
"red",
"yellow",
"green"]

var count = dictionary.count

var string = "blue yellow red green blue red"

var value = 0

for var index = 0; index < count; index++ {
    if string.lowercaseString.rangeOfString(dictionary[index]) != nil {
            print("\(dictionary[index])")
            value++
            print("\(dictionary[index]) is a flagged word")
            print(value)
    }
}
导入Swift
进口基金会
变量字典:[字符串]=
[“蓝色”,
“红色”,
“黄色”,
“绿色”]
var count=dictionary.count
var string=“蓝黄红绿蓝红”
var值=0
对于var指数=0;指数<计数;索引++{
如果string.lowercasesetring.rangeOfString(字典[索引])!=nil{
打印(\(字典[索引])
价值观++
print(\(字典[索引])是一个带标记的单词)
打印(值)
}
}

这样做只会将值设置为4(应该是6),因为它只会对每个单词计数一次,并且会忽略其他蓝色和红色子字符串。有解决办法吗?我找不到有关此的任何信息,谢谢。

最简单的方法是组合
由字符串分离的组件,并减少:

var count = string.componentsSeparatedByString(" ").reduce(0) {
   words.contains($1) ? $0 + 1 : $0 
}
虽然这与您的示例所做的事情并不完全相同,因为它假设您实际上在字典中查找单词。如果您实际上只是在查找字符串匹配,请尝试:

var count2 = words.map({
    string.componentsSeparatedByString($0).count - 1
}).reduce(0, combine:+)

最简单的方法是组合由字符串分离的组件,并减少:

var count = string.componentsSeparatedByString(" ").reduce(0) {
   words.contains($1) ? $0 + 1 : $0 
}
虽然这与您的示例所做的事情并不完全相同,因为它假设您实际上在字典中查找单词。如果您实际上只是在查找字符串匹配,请尝试:

var count2 = words.map({
    string.componentsSeparatedByString($0).count - 1
}).reduce(0, combine:+)

这可能会帮助你:太好了,它工作得很好…不知道我怎么会错过那一个你应该尽量避免使用
for循环,它将在Swift的未来版本中删除,并且非常不快速。相反,对于字典中的单词{…}
@KennethBruno,甚至对于字典中的单词
也应该使用
映射
平面映射
的某种形式或组合来替换,
filter
和/或
reduce
@DavidBerry我同意这些功能在很多情况下都很好,但为了清晰起见,在
循环中使用
for…也同样有效。这可以归结为编程风格。这可能会帮助你:完美,它工作得很好…不知道我怎么会错过那一个你应该尽量避免使用
for循环,它将在Swift的未来版本中删除,并且非常不快速。相反,对于字典中的单词{…}
@KennethBruno,甚至对于字典中的单词
也应该使用
映射
平面映射
的某种形式或组合来替换,
filter
和/或
reduce
@DavidBerry我同意这些功能在很多情况下都很好,但为了清晰起见,在
循环中使用
for…也同样有效。这可以归结为编程风格。第二个示例是执行此任务的一种聪明方法。然而,对于不熟悉这项技术的人来说,这可能是不可理解的,应该有一些解释。也许,在未来几年的swift发展中,我认为(希望)每个人都将足够熟悉swift的功能/声明机制(map、flatMap、filter、reduce)对这些结构的冗长解释将变得不必要:)我同意,它们非常强大和有用。如果使用得当,它们可以大大简化和澄清代码。在那之前,我们必须把它教给所有人!是的,一旦你理解了它们的含义,以及它们的普遍适用性,它几乎就变成了一个“非常糟糕”的时刻。第二个例子是执行这项任务的聪明方法。然而,对于不熟悉这项技术的人来说,这可能是不可理解的,应该有一些解释。也许,在未来几年的swift发展中,我认为(希望)每个人都将足够熟悉swift的功能/声明机制(map、flatMap、filter、reduce)对这些结构的冗长解释将变得不必要:)我同意,它们非常强大和有用。如果使用得当,它们可以大大简化和澄清代码。在那之前,我们必须把它教给所有人!是的,一旦你理解了它们的意思,以及它们的普遍适用性,它几乎就变成了一个“好无聊”的时刻。