Как я могу индивидуально заменить каждое вхождение строки? - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь заменить каждое вхождение пробела двумя случайными символами (из 103). Проблема в том, что это всегда одни и те же 2 символа каждый раз, что имеет смысл, если вы посмотрите на код

Я довольно новичок в Swift и Xcode, и я уже пробовал кучу вещей, таких как использование цикла for.

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

Как я уже говорил, это всегда одни и те же 2 символа, когда я хочу, чтобы он "обновлялся" при каждом появлении пробела.

Ответы [ 3 ]

0 голосов
/ 29 мая 2019

Использование метода map(_:) вместо replacingOccurrences(of:with:) для получения желаемого результата.

replacingOccurrences(of:with:)

Новая строка, в которой все вхождения цели в приемникезаменено на замену.

Заменяет все вхождения на тот же экземпляр, который передается в 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, вы можете напрямую использовать randomElement()на randomArray вместо использования random(in:) на Int, т.е.

Использование

randomArray.randomElement()

вместо

randomArray[Int.random(in: 0...103)]
0 голосов
/ 29 мая 2019

Вы должны заменить каждый пробел различными случайными элементами массива.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()

0 голосов
/ 29 мая 2019

Да, ваше поведение ожидается с учетом вашего кода. Параметр, переданный в 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: " ")
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...