在Swift中功能性地反转单词

时间:2018-05-02 01:21:50

标签: swift string

我可以在不使用循环的情况下在功能上反转字符串中的每个单词,但是当我尝试反转每个其他字时。我遇到了问题。我可以用循环但不是功能。我在这里看不到什么?

功能上(每个字):

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 :(得分:2)

使用stride()生成每个其他单词的索引序列。

然后使用forEach()选择stride数组中的每个索引,并使用它来改变该索引处的单词以反转它。

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"

答案 1 :(得分:2)

稍微修改一下int c = (int)(dtp2.Value.Date-dtp1.Value.Date).TotalDays + 1; DateTime[] d = new DateTime[c]; for (int i = 0; i < c; i++) { d[i] = dtp1.Value.Date.AddDays(i); } ,你可以反转其他所有单词。使用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))
  

或者你可以在Swift的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))