Какой хороший способ повторить итерации через символы строки?

Какой самый быстрый способ итерации назад через символы в строке? т.е. как for ch in str, только в обратном направлении?

Я думаю, что я должен упустить что-то очевидное, потому что самое лучшее, что я мог придумать сейчас:

    for var index = str.endIndex; 
            index != str.startIndex; 
            index = index.predecessor() {
        let ch = str[index.predecessor()]
        ...
    }

Я понимаю, "что лучше..." можно классифицировать как субъективное; Я полагаю, что то, что я действительно ищу, - это краткая, но читаемая форма этого.

Изменить: хотя функция reverse() работает и является кратким, похоже, что это может быть довольно неэффективно по сравнению с предыдущим, т.е. кажется, что он фактически не выполняет итерацию назад, а создает полную обратную копию символов в String. Это было бы намного хуже, чем мой оригинал, если, скажем, вы искали что-то, что обычно было несколько символов с конца строки в 10 000 символов. Поэтому я оставляю этот вопрос открытым, чтобы привлечь другие подходы.

Ответ 1

Функция reversed меняет направление C: CollectionType и возвращает a ReversedCollection:

for char in "string".characters.reversed() {
  // ...
}

Если вы обнаружите, что reversed предварительно инвертирует строку, попробуйте:

for char in "string".characters.lazy.reversed() {
  // ...
}

lazy возвращает лениво оцененную последовательность (LazyBidirectionalCollection), тогда reversed() возвращает другую LazyBidirectionalCollection, которая посещается в обратном порядке.

Ответ 2

По состоянию на декабрь 2015 года с Swift версии 2.1 правильный способ сделать это

for char in string.characters.reverse() {
    //loop backwards
}

Строка больше не соответствует SequenceType<T>, но ее набор символов делает.

Ответ 3

Не уверен в эффективности, но я предлагаю

for ch in reverse(str) {
    println(ch)
}

Ответ 4

Вот код для изменения строки, которая не использует reverse (str)

  // Reverse String

func myReverse(str:String) -> String {

    var buffer = ""

    for character in str {

        buffer.insert(character, atIndex: buffer.startIndex)
    }

    return buffer
}

myReverse("Paul")  // gives "luaP"

Небольшой эксперимент. За что его стоит.

Хорошо, наклонился, как читать вопрос....

Будет ли это работать Мэттом?

func ReverseIteration(str:String) {

    func myReverse(str:String) -> String {

        var buffer = ""

        for character in str {

            buffer.insert(character, atIndex: buffer.startIndex)
        }

        return buffer
    }

    // reverse string then iterate forward.

    var newStr = myReverse(str)

    for char in newStr {

        println(char)
        // do some  code here

    }

Ответ 5

extension String {
    var reverse: String {
        var reverseStr = ""
        for character in self {
            reverseStr = String(character) + reverseStr
        }
        return reverseStr
    }
}