Символ в массиве строк Swift

Я пытаюсь найти положение букв, составляющих строку. Например, мне нужно знать позиции буквы «с» в слове «персонаж» для дальнейшего расчета.

Я старался

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

Все, что я получаю из консоли, это два нуля; это дает мне только индекс первого c в «символе», но не второго c. Тот факт, что он выводит «неправильную букву», означает, что цикл работает правильно; он даже распознает позицию второго c, просто не дает правильного индекса.


person Yiu Chung Wong    schedule 21.03.2017    source источник


Ответы (2)


Ваш код не работает должным образом, потому что

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

всегда находит первое вхождение буквы в строку, например при поиске «c» это всегда будет возвращать нулевой индекс.

Вы можете упростить задачу, используя enumerated(), который дает вам символы вместе с соответствующим индексом и делает ненужными все преобразования Array() и поиск через index(of:):

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 { $0.element == search }
    .map { $0.offset }


print(indices) // [0, 5]

Это может быть дополнительно оптимизировано для

let indices = word.characters.enumerated()
    .flatMap { $0.element == search ? $0.offset : nil }

Если строка большая, возможно, лучше подойдут другие методы, см., например, Найти все индексы поискового запроса в строке.

person Martin R    schedule 21.03.2017

Вы можете сделать как

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
person Ram    schedule 21.03.2017