如何分别替换每次出现的字符串?

时间:2019-05-29 05:08:28

标签: swift

我试图用两个随机字符(在103个字符中)替换每次出现的空格。问题是每次总是两个相同的字符,如果您看一下代码就很有意义

我对Swift和Xcode还是很陌生,我已经尝试了很多方法,例如使用“ for”循环。

newSentence = passedSentence.replacingOccurrences(of: " ", with: " \(randomArray[Int.random(in: 0...103)]) \(randomArray[Int.random(in: 0...103)]) ")    
resultText.text = newSentence

正如我之前说过的,当我希望它每次出现一个空格时都“刷新”时,它始终是两个相同的字符。

3 个答案:

答案 0 :(得分:0)

是的,您的行为符合您的代码。 with:中传递的参数仅执行一次,因此如果它生成“ SX”,它将用于替换passedSentence中所有出现的“”(空格)。

要获得预期的行为,您必须循环:

var rangeOfEmptyString = passedSentence.range(of: " ")
while rangeOfEmptyString != nil {
   let randomModifier = "\(randomArray[Int.random(in: 0...103)])\(randomArray[Int.random(in: 0...103)])"
   passedSentence = passedSentence.replacingCharacters(in: rangeOfEmptyString!, with: randomModifier)
   rangeOfEmptyString = passedSentence.range(of: " ")
}

答案 1 :(得分:0)

使用map(_:)方法而非replacingOccurrences(of:with:)获得所需的结果。

  

replacingOccurrences(of:with:)

     

一个新字符串,其中接收者中出现的所有target都是   替换为替换。

它用replacementString中传递的同一实例替换所有出现,即randomArray[Int.random(in: 0...103) (randomArray[Int.random(in: 0...103)]仅执行一次,并在string中用于所有" "的出现

    let passedSentence = "This is a sample sentence"

    let newSentence = (passedSentence.map { (char) -> String in
        if char == " " {
            return " \(randomArray[Int.random(in: 0...103)]) \(randomArray[Int.random(in: 0...103)]) "
        }
        return String(char)
    }).joined()

    print(newSentence)

如果您使用的是整个randomArray,即如果randomArray包含104 elements i.e. 0...103,则可以直接在randomArray上使用randomElement()random(in:)上使用Int的原因,即

使用

randomArray.randomElement()

代替

randomArray[Int.random(in: 0...103)]

答案 2 :(得分:0)

您应该用数组的不同随机元素替换每个空格。 replacingOccurrences方法可一次替换所有范围。一对一地获取空间范围,并替换为唯一的随机元素

let randomArray:[String] = ["a","b","c","d"]
var passedSentence = "This is a long text"
var start = passedSentence.startIndex
while let range = passedSentence[start...].rangeOfCharacter(from: .whitespaces),
    let random1 = randomArray.randomElement(),
    let random2 = randomArray.randomElement()  {
    let replacementString = " \(random1) \(random2) "
    passedSentence.replaceSubrange(range, with: " \(random1) \(random2) ")
    start = passedSentence.index(range.upperBound, offsetBy: replacementString.count)
}
print(passedSentence)

要从数组中获取随机元素,请不要使用randomArray[Int.random(in: 0...103)]。您可以使用randomElement()