Я пытаюсь заменить каждое появление пробела двумя случайными символами (из 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 символа, когда я хочу, чтобы они «обновлялись» для каждого появления пробела.
Да, ваше поведение ожидается с учетом вашего кода. Параметр, переданный в 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: " ")
}
Использование метода map(_:)
вместо replacingOccurrences(of:with:)
для получения желаемого результата.
replacingOccurrences(of:with:)
A new string in which all occurrences of target in the receiver are replaced by replacement.
Он заменяет все вхождения тем же экземпляром, который передается в 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)]
Вы должны заменить каждый пробел разными случайными элементами массива. 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()
Вам нужно показать четкие примеры ввода и вывода.