2017-02-18 2 views
0

Я пытаюсь использовать регулярное выражение и диапазон в первый раз в Swift. Я хочу посмотреть, будет ли письмо, которое пользователь вводит в текстовое поле, будет соответствовать тому, что они должны угадать. Если он соответствует совпадающей букве, или буквы будут отображаться в UILabel (подобно тому, как вы играете в палача, если вы угадываете правильную букву один раз, и есть несколько вхождений этой буквы, все проявления будут отображаться). Когда нажимается кнопка, вызывается метод ниже. Он отлично работает при поиске совпадающих букв и вставляет их в нужное место, НО, когда UILabel обновляется после цикла, он только обновляет метку с результатом второго/конечного цикла. Как я могу получить комбинацию результата от всех итераций цикла? Любая помощь будет оценена по достоинству. СпасибоSwift - Как получить все вхождения диапазона?

func findLetter(displayedWord toSearchin: String, userInput toSearchFor: String) { 

    let ranges: [NSRange] 
    var labelUpdate = String() 
    do { 
     let regex = try NSRegularExpression(pattern: toSearchFor, options: []) 
     let displayedWord = toSearchin as NSString 
     let rangeOfSearch = NSMakeRange(0, displayedWord.length) 
     ranges = regex.matches(in: toSearchin, range: rangeOfSearch).map {$0.range} 
     let nsStringlabel = wordLabel.text as NSString? 

     for range in ranges { 
      labelUpdate = (nsStringlabel?.replacingCharacters(in: range, with: toSearchFor))! 
      print(labelUpdate) 
      //the word is lavenders, so this prints: 
      //___e_____ 
      //______e__ 
      // I want: 
      //___e__e__ 
     } 

     DispatchQueue.main.async(execute: { 

      self.wordLabel.text = labelUpdate 

     }) 

    } 
    catch { 
     ranges = [] 
    } 

} 
+0

В вашем цикле 'for range in range' вы всегда меняете * оригинал *' nsStringlabel' ... –

ответ

0

Как указано в комментарии, вы всегда обновление исходной nsStringlabel переменной, таким образом, всегда перекрывая предыдущую модификацию в предыдущем запуске цикла.

Я рекомендую вам установить labelUpdate с помощью wordLabel.text as NSString? и полностью удалить nsStringlabel. Это должно решить вашу проблему.

Это, как говорится, есть много других проблем, которые могут быть исправлены в этой функции. В частности, зачем использовать регулярные выражения? Это дорого и не полезно. Кроме того, вы отправляете перед установкой значения метки, что хорошо, но не до получения значения ... либо отправка необходима, либо нет, но она не может понадобиться в одном месте, а не в другом. Если вы вызываете свою функцию из основного потока (например, как ответ на ввод пользователя), вы должны быть добрыми и не нуждаетесь в отправке.

Вот что я сделал бы (должно быть безопаснее и быстрее):

func updateLabel(withDestinationWord destinationWord: String, userInput: String) { 
    var labelText = wordLabel.text 
    var startIndex = labelText.characters.startIndex 
    while let r = destinationWord.range(of: userInput, options: .caseInsensitive, range: startIndex..<labelText.characters.endIndex) { 
     labelText.replaceSubrange(r, with: userInput) 
     startIndex = labelText.characters.index(after: r.lowerBound) 
    } 
    wordLabel.text = labelText 
} 

Обязательно иметь одинаковую длину для wordLabel.text и destinationWord!

+1

А я вижу - это полностью имеет смысл и работает! спасибо – LTC

Смежные вопросы