Реверсивные слова функционально в Swift - PullRequest
0 голосов
/ 02 мая 2018

Я могу перевернуть каждое слово в строке функционально, не используя цикл, но когда я пытаюсь перевернуть КАЖДОЕ ДРУГОЕ СЛОВО. Я сталкиваюсь с проблемами. Я могу сделать это с помощью цикла, но не функционально. Что я здесь не вижу?

Функционально (каждое слово):

import UIKit

let input = "This is a sample sentence"

func reverseWords(input: String) -> String {
    let parts = input.components(separatedBy: " ")
    let reversed = parts.map { String($0.reversed()) }
    return reversed.joined(separator: " ")
}

reverseWords(input: input)

С петлей (КАЖДОЕ ДРУГОЕ СЛОВО):

var sampleSentence = "This is a sample sentence"

func reverseWordsInSentence(sentence: String) -> String {
    let allWords = sampleSentence.components(separatedBy:" ")
    var newSentence = ""

    for index in 0...allWords.count - 1 {
        let word = allWords[index]
        if newSentence != "" {
            newSentence += " "
        }

        if index % 2 == 1 {
            let reverseWord = String(word.reversed())
            newSentence += reverseWord
        } else {
            newSentence += word
        }
    }
    return newSentence
}
reverseWordsInSentence(sentence: sampleSentence)

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

С небольшой модификацией вашего reverseWords вы можете поменять местами любое другое слово. Используйте enumerated(), чтобы объединить слово с его положением, а затем используйте его, чтобы перевернуть нечетные слова:

let input = "one two three four five"

func reverseOddWords(input: String) -> String {
    let parts = input.components(separatedBy: " ")
    let reversed = parts.enumerated().map { $0 % 2 == 0 ? String($1.reversed()) : $1 }
    return reversed.joined(separator: " ")
}

print(reverseOddWords(input: input))
eno two eerht four evif

Или вы можете создать свою функцию после sort Свифта и передать закрытие filter функции reverseWords:

let input = "one two three four five"

func reverseWords(_ input: String, using filter: ((Int) -> Bool) = { _ in true }) -> String {
    let parts = input.components(separatedBy: " ")
    let reversed = parts.enumerated().map { filter($0) ? String($1.reversed()) : $1 }
    return reversed.joined(separator: " ")
}

// default behavior is to reverse all words
print(reverseWords("one two three four five"))
eno owt eerht ruof evif
print(reverseWords("one two three four five", using: { $0 % 2 == 1 }))
one owt three ruof five
print(reverseWords("one two three four five", using: { [0, 3, 4].contains($0) }))
eno two three ruof evif
let everyThirdWord = { $0 % 3 == 0 }

print(reverseWords("one two three four five", using: everyThirdWord))
eno two three ruof five
0 голосов
/ 02 мая 2018

Используйте stride() для генерации последовательности индексов любого другого слова.

Затем используйте forEach(), чтобы выбрать каждый индекс в массиве шагов, и используйте его, чтобы изменить слово в этом индексе, чтобы обратить его.

import UIKit

let string = "Now is the time for all good programmers to babble incoherently"

var words = string.components(separatedBy: " ")

stride(from: 0, to: words.count, by: 2)
.forEach { words[$0] = String(words[$0].reversed()) }


let newString = words.joined(separator: " ")

print(newString)

Выходная строка:

"woN is eht time rof all doog programmers ot babble yltnerehocni"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...