2016-08-16 3 views
0

Ich bin ein seltsames Verhalten erleben ...rasche LLDB produziert korrekte Ergebnisse, aber unterschiedliche Ergebnisse von Codeausführung

Kurz gesagt - Sie diesen Befehl ausführen (auf Range<Index>) innerhalb eines Anwendungscode

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

wird ignoriert ...

Wenn ich einen Haltepunkt nach diesem Befehl gesetzt und po a im Debug-Fenster (LLDB) laufen, die ich erhalten:

▿ Optional> ▿ Einige: Range (39 .. < 44) - start: 39 - endIndex: 44

während po currIndexPlaceA ist:

▿ Range (5 .. < 54) - start: 5 - endIndex: 54

es ist klar, dass start sollte höher t gewesen sein Han 39!

aber, den gleichen Befehl durch das LLDB Fenster ausgeführt:

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

Ergebnisse in (po currIndexPlaceA):

▿ Range (40 .. < 54) - start: 40 - endIndex: 54

Was ist hier los ?????

Wenn Sie meine volle Funktion zu debuggen .. es ist eine Art von Kopfschmerzen - es ist eine Art von XML-Parser ist ...

ich es mit Text testen: <id><id></id><id/><id /><id><id /><id/><id></id></id></id>

und 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

BTW verwenden, Swift nicht 'verwendet;' das Ende einer Codezeile zu markieren. –

+0

Es erlaubt es syntax weise, ich mag es zu verwenden, da ich 4 verschiedene Sprachen während meines Tages, und nicht setzen es ist seltsam für mich .. Dies sollte nicht das Problem sein ... – evenro

+0

P.s. Ich setze normalerweise auch Bedingungen in Klammern, obwohl Apple das nicht sonderlich empfiehlt, und in einigen Szenarien kann es es nicht kompilieren ... – evenro

Antwort

1

Also hier ist der störende Code.

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

Ein bestimmte Fehler ist die Abschattung der ab und außerhalb der Schleife while erklärt mit den var avar b und in diesem else Block. Was Ihr LLDB-Problem betrifft, stellen Sie absolut sicher, dass Sie in der Zeile stehen, in der currIndexPlaceB eingestellt ist und nicht auf oder nach, wo var a gesetzt ist. Stellen Sie sicher, dass alle Optimierungen deaktiviert wurden, da dies dazu führen kann, dass die Code-Platzierung gemischt wird.


(Fragenschreiber ...Hinzufügen von Code-Änderungen, die das Problem gelöst haben)

Ich füge hier den endgültigen Code hinzu, mit zusätzlichen Bugs behoben (also wenn jemand Tags von XML bekommen will - Sie haben ein Kopieren-Einfügen). Wenn zunächst das Debuggen - ich did't verstehen, was so los war begann ich endIndex statt startIndex usw.

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

Guter Fang !! Ich würde es vielleicht nicht bemerken, da ich viel zu lange vor Computern war ... Ich werde es morgen bestätigen. Vielen Dank! – evenro

+0

in Bezug auf die LLDB - Ich stoppte auf dieser Kommandozeile, führte es aus, und sofort nach Überprüfung ... Ich habe keine Erklärung für das, aber da das Problem gelöst ist, ist es nicht mehr so ​​wichtig für mich (ich nehme an, es ist Optimierungen , da der Debugger rum läuft ...) DANKE !! – evenro

Verwandte Themen