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;
}
BTW verwenden, Swift nicht 'verwendet;' das Ende einer Codezeile zu markieren. –
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
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