字符串数组中的字符 swift

Character in String array swift

我正在尝试查找组成字符串的字母的位置。 例如,我需要知道字母 "c" 在单词 "character" 中的位置,以便进一步计算。

我试过了

for letters in Array("character".characters) {
    if "c".contains(String(letters)) {
    if let i = Array("character".characters).index(of: letters) {
    print(i) 
    }
   } else { print("wrong letter") }
  }

// Console:
0
wrong letter
wrong letter
wrong letter
wrong letter
0
wrong letter
wrong letter
wrong letter

我从控制台得到的只有两个零;它只给我 "character" 中第一个 c 的索引,而不是第二个 c 的索引。 它打印出 "wrong letter" 的事实意味着循环是正确的 运行;它甚至可以识别第二个 c 的位置,只是没有给出正确的索引。

你可以按照

let test  = "character"
let arr = Array(test.characters)
for i in 0..<arr.count {
if arr[i] == "c"{

    print(i)
    } else { print("wrong letter") }

}
output
// 0
//wrong letter
//wrong letter
//wrong letter
//wrong letter
//5
//wrong letter
//wrong letter
//wrong letter

您的代码没有按预期工作,因为

Array("character".characters).index(of: letters)

总是找到字符串中第 次出现的字母,例如 搜索 "c" 时,这将始终 return 索引为零。

您可以使用 enumerated() 来简化任务, 它为您提供字符以及相应的索引, 并且无需通过 index(of:) 进行所有 Array() 转换和搜索:

let word = "character"
let search = Character("c")

for (index, letter) in word.characters.enumerated() where letter == search {
    print(index)
}
// 0  5

或者,如果您希望将索引作为数组:

let indices = word.characters.enumerated()
    .filter { [=12=].element == search }
    .map { [=12=].offset }


print(indices) // [0, 5]

这可以进一步优化为

let indices = word.characters.enumerated()
    .flatMap { [=13=].element == search ? [=13=].offset : nil }

如果字符串那么其他方法可能更适合, 参见例如.