2017-02-18 12 views
0

私はSwiftで初めてregexとrangeを使用しようとしています。ユーザーがテキストフィールドに入力した文字が、推測しなければならない単語と一致するかどうかを確認したい。一致する場合は一致する文字がUILabelに表示されます(ハングマンを再生する方法と同様に、正しい文字を一度推測し、その文字が複数出現するとすべての出現が表示されます)。ボタンをクリックすると、以下のメソッドが呼び出されます。一致する文字を見つけて適切な場所に挿入するとうまくいきますが、ループの後にUILabelが更新されたときには、2番目の/最終ループの結果でラベルが更新されるだけです。どのようにしてループのすべての反復の結果を組み合わせることができますか?どんな助けもありがとう。コメントで述べたように、あなたスイフト - 範囲のすべての出現を取得するには?

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

'range for in ranges'ループでは、オリジナルの' nsStringlabel'を常に変更します... –

答えて

0

ありがとう、あなたは常にので、常に前のループの実行中に、以前の変更を上書きし、元nsStringlabel変数を更新しています。

wordLabel.text as NSString?で初期labelUpdateをお勧めします。nsStringlabelを完全に削除してください。これはあなたの問題を解決するはずです。

これは、この機能で修正できる他の多くの問題があると言われています。 特に、regexesを使う理由は?それは高価で、そこでは役に立たない。 また、ラベルの値を設定する前にディスパッチしていますが、値を取得する前ではありません。ディスパッチが必要であるか、そうではありませんが、ある場所では必要なく、もう一方では必要ではありません。メインスレッドから関数を呼び出すと(例えば、ユーザー入力への応答として)、あなたはディスパッチを必要としなくていいはずです。私が行っているだろうか。ここ

(より安全かつ迅速でなければなりません):

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.textdestinationWordに同じ長さを持つようにしてください!

+1

ああ私が見る - これは完全に意味があり、動作します!本当にありがとう – LTC

関連する問題