IOS Как получить несколько String.range(of:string) в Swift

Мой текст

let myString: NSAttributedString = <siren> 123123 <siren> 123123 <siren>
let myRange = myString.string.range(of:"<siren>")
let newString = NSMutableAttributedString()
newString.append(myString)
if myRange != nil{
  newString.replaceCharacters(in: NSRange(myRange, in:myString.string), 
            with:myAttributeString as NSAttributedString!)
}

Если у myString есть один <siren>, это работает, но не работает, когда у него больше двух <siren>

заменить только первый <siren>

Я думаю, что String.range возвращает первое значение

как их всех найти?


person Adam    schedule 04.07.2018    source источник
comment
а) это не рабочий код. б) не начинайте переменные с заглавных букв, это затрудняет определение классов по переменным. Пожалуйста обновите   -  person Ashley Mills    schedule 04.07.2018
comment
Возможный дубликат Быстрый поиск всех вхождений подстроки   -  person Larme    schedule 04.07.2018
comment
Работайте со строкой, затем преобразуйте ее в атрибутированную строку   -  person Inder Kumar Rathore    schedule 04.07.2018


Ответы (1)


Если вы хотите найти все диапазоны, вы можете попробовать использовать решение из этого вопроса получить все диапазоны подстроки в строке в swift

но если ваша основная цель - заменить появление какой-либо строки/шаблона, вы можете добавить такое расширение:

extension String {

  func replacing(pattern: String, withTemplate: String) throws -> String {
    let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
    return regex.stringByReplacingMatches(in: self,
                                          options: [],
                                          range: NSRange(0 ..< utf16.count),
                                          withTemplate: withTemplate)
  }
}
person Piotr Labunski    schedule 04.07.2018