2016-08-16 7 views
0

...要するにSWIFT LLDBは、コードの実行から正しい結果が、異なる結果を生成し、私は奇妙な行動を経験してい

- アプリケーションコード

currIndexPlaceA = a!.startIndex.successor()..<newText.endIndex; 
内( Range<Index>上)このコマンドを実行します

は、私は、このコマンドの後にブレークポイントを設定すると...

無視し、デバッグウィンドウでpo a(lldb)を実行している、私が取得:

▿オプション>▿一部:レンジ(39 .. < 44) - のstartIndex:39 - endIndexの:44

po currIndexPlaceAがありながら:

▿レンジ(5 .. < 54) - のstartIndex:5 - endIndexの:54

startIndexのは、高いトンされている必要があることは明らかですハン39!

しかし、lldb窓を通して同じコマンドを実行する:(po currIndexPlaceA)で

expr currIndexPlaceA = a!.startIndex.successor()..<newText.endIndex; 

結果:

▿範囲(40 .. < 54) - のstartIndex:40 - endIndex:54

ここでは何が起こっているのですか?

あなたは私の完全な機能をデバッグしたい場合は...それは頭痛のようなものだ - それは、XMLパーサの一種だ...

私はテキストとそれをテスト:<id><id></id><id/><id /><id><id /><id/><id></id></id></id>

とtagNameを:id

func getTagContent(text : String, tagName : String) -> [String!]!{ 
     // Extracts reply 
     var newText = text; 
     var currProcessing = text; 
     var retVal = [String!](); 
     while (newText != ""){ 
      let rangeFirst = newText.rangeOfString("<" + tagName, options: [], range: nil, locale: nil); 
      if let actrange = rangeFirst 
      { 
       newText = newText.substringFromIndex(actrange.startIndex.advancedBy(tagName.characters.count + 1)); 

       let rangeEndFirstTag = newText.rangeOfString(">"); 
       if let actRangeEndFirstTab = rangeEndFirstTag { 
        let distToCloseTag = newText.startIndex.distanceTo(actRangeEndFirstTab.startIndex) 
        if (distToCloseTag == 0 || (distToCloseTag > 0 && newText[actRangeEndFirstTab.startIndex.predecessor()] != "/")) { 
         newText = newText.substringFromIndex(actRangeEndFirstTab.startIndex.advancedBy(1)); 

         var currIndexPlaceA = newText.startIndex..<newText.endIndex; 
         var currIndexPlaceB = newText.startIndex..<newText.endIndex; 
         var a = newText.rangeOfString("</" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil); 
         if a == nil {a = newText.rangeOfString("</" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil);} 
         var b = newText.rangeOfString("<" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
         if b == nil {b = newText.rangeOfString("<" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil);} 

         while (a != nil && b != nil && b?.startIndex < a?.startIndex){ 
          let txt = newText.substringFromIndex(b!.endIndex); 
          var closedTag = false; 
          if let tmpRagne = txt.rangeOfString(">"){ 
           if (tmpRagne.startIndex > txt.startIndex){ 
            if (txt[tmpRagne.startIndex.predecessor()] == "/"){ 
             closedTag = true; 
            } 
           } 
          } 

          if closedTag{ 
           currIndexPlaceB = b!.startIndex.successor()..<newText.endIndex; 
           var b = newText.rangeOfString("<" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
           if b == nil {b = newText.rangeOfString("<" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil);} 
          } 
          else{ 
           currIndexPlaceA = a!.startIndex.successor()..<newText.endIndex; 
           currIndexPlaceB = b!.startIndex.successor()..<newText.endIndex; 

           var a = newText.rangeOfString("</" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil); 
           if a == nil {a = newText.rangeOfString("</" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil);} 
           var b = newText.rangeOfString("<" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
           if b == nil {b = newText.rangeOfString("<" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil);} 
          } 
         } 
         if a == nil { return nil; } 


         currProcessing = newText.substringToIndex(a!.startIndex); 
         retVal.append(currProcessing); 
         newText = newText.substringFromIndex(a!.startIndex.successor()); 
         if let lastRange = newText.rangeOfString(">"){ 
          newText = newText.substringFromIndex(lastRange.endIndex); 
         } 
         else { 
          return nil; 
         } 

        } 
        else{ 
         newText = newText.substringFromIndex(actRangeEndFirstTab.startIndex.successor()); 
         retVal.append(nil); 
        } 
       } 
      } 
      else { 
       break; 
      } 
     } 


     return retVal; 
    } 
+0

をところで、スウィフトは '使用していません;'コード行の終わりをマークします。 –

+0

それは構文が賢明です、私は私の一日を通して4つの異なる言語を使用しているので、私はそれを使用して好きですそれを置くことは私のために変です...これは問題ではありません... – evenro

+0

P.s.私はまた、通常、リンゴは奇妙なことをお勧めしませんが、カッコ内に条件を入れて、いくつかのシナリオでは、それをコンパイルすることはできません... – evenro

答えて

1

ここに問題のコードがあります。

currIndexPlaceA = a!.startIndex.successor()..<newText.endIndex; 
currIndexPlaceB = b!.startIndex.successor()..<newText.endIndex; 
var a = newText.rangeOfString("</" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil); 

明確バグこのelseブロック内var avar bwhileループ外で宣言abのシャドウイングです。あなたのLLDBの問題に関しては、currIndexPlaceBが設定されていて、それ以降の行に停止していることを絶対に確かめてください。var aが設定されています。最適化がすべてオフになっていることを確認して、コードの配置をシャッフルします。


(質問者...

私はここに最終的なコードを追加し、追加のバグを修正しました。(誰かがXMLからタグを取得したい場合は、コピー貼り付けをします)。最初にデバッグするとき - 私は何が起こっていたか認識できませんでしたので、私はendIndex代わりのstartIndexを使用して開始など

func getTagContent(text : String, tagName : String) -> [String!]!{ 
    // Extracts reply 
    var newText = text; 
    var currProcessing = text; 
    var retVal = [String!](); 
    while (newText != ""){ 
     let rangeFirst = newText.rangeOfString("<" + tagName, options: [], range: nil, locale: nil); 
     if let actrange = rangeFirst 
     { 
      newText = newText.substringFromIndex(actrange.startIndex.advancedBy(tagName.characters.count + 1)); 

      let rangeEndFirstTag = newText.rangeOfString(">"); 
      if let actRangeEndFirstTab = rangeEndFirstTag { 
       let distToCloseTag = newText.startIndex.distanceTo(actRangeEndFirstTab.startIndex) 
       if (distToCloseTag == 0 || (distToCloseTag > 0 && newText[actRangeEndFirstTab.startIndex.predecessor()] != "/")) { 
        newText = newText.substringFromIndex(actRangeEndFirstTab.startIndex.advancedBy(1)); 

        var currIndexPlaceA = newText.startIndex..<newText.endIndex; 
        var currIndexPlaceB = newText.startIndex..<newText.endIndex; 
        var a = newText.rangeOfString("</" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil); 
        if a == nil {a = newText.rangeOfString("</" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil);} 
        var b = newText.rangeOfString("<" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
        if b == nil {b = newText.rangeOfString("<" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil);} 

        while (a != nil && b != nil && b?.startIndex < a?.startIndex){ 
         let txt = newText.substringFromIndex(b!.startIndex); 
         var closedTag = false; 
         if let tmpRagne = txt.rangeOfString(">"){ 
          if (tmpRagne.startIndex > txt.startIndex){ 
           if (txt[tmpRagne.startIndex.predecessor()] == "/"){ 
            closedTag = true; 
           } 
          } 
         } 

         if closedTag{ 
          currIndexPlaceB = b!.endIndex..<newText.endIndex; 
          b = newText.rangeOfString("<" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
          let tmpb = newText.rangeOfString("<" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
          if (b == nil || (tmpb != nil && tmpb?.startIndex < b?.startIndex)) {b = tmpb;} 
         } 
         else{ 
          currIndexPlaceA = a!.endIndex..<newText.endIndex; 
          currIndexPlaceB = b!.endIndex..<newText.endIndex; 

          a = newText.rangeOfString("</" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil); 
          let tmpa = newText.rangeOfString("</" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil); 
          if (a == nil || (tmpa != nil && tmpa!.startIndex < a?.startIndex)) {a = tmpa;} 
          b = newText.rangeOfString("<" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
          let tmpb = newText.rangeOfString("<" + tagName + " ", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceB, locale: nil); 
          if (b == nil || (tmpb != nil && tmpb?.startIndex < b?.startIndex)) {b = tmpb;} 
         } 
        } 
        if a == nil { return nil; } 


        currProcessing = newText.substringToIndex(a!.startIndex); 
        retVal.append(currProcessing); 
        newText = newText.substringFromIndex(a!.startIndex.successor()); 
        if let lastRange = newText.rangeOfString(">"){ 
         newText = newText.substringFromIndex(lastRange.endIndex); 
        } 
        else { 
         return nil; 
        } 

       } 
       else{ 
        newText = newText.substringFromIndex(actRangeEndFirstTab.startIndex.successor()); 
        retVal.append(nil); 
       } 
      } 
     } 
     else { 
      break; 
     } 
    } 


    return retVal; 
} 
+0

良いキャッチ!私はあまりにも長い間コンピュータの前にいたので気づかないかもしれません...明日はそれを確認します。ありがとう! LLDBに関する – evenro

+0

- 私はそのコマンドラインで停止し、それを実行した直後にチェックしました...私はその問題については説明しませんが、問題は解決されて以来、私にとってはそれ以上重要ではありませんデバッガが周りを走っていたので...)ありがとう! – evenro

関連する問題