我遇到了一个奇怪的行为......
简而言之 - 在应用程序代码中运行此命令(在 Range<Index>
上)
currIndexPlaceA = a!.startIndex.successor()..<newText.endIndex;
被忽略...
当我在此命令后设置断点并运行 po a
时在调试窗口 (lldb) 中,我得到:
▿ Optional> ▿ Some : Range(39..<44) - startIndex : 39 - endIndex : 44
同时 po currIndexPlaceA
是:
▿ Range(5..<54) - startIndex : 5 - endIndex : 54
很明显startIndex应该高于39!
但是,通过 lldb 窗口运行相同的命令:
expr currIndexPlaceA = a!.startIndex.successor()..<newText.endIndex;
结果在 ( po currIndexPlaceA
):
▿ Range(40..<54) - startIndex : 40 - endIndex : 54
这是怎么回事????
如果你想调试我的全部功能..有点头疼——它是一种 xml 解析器...
我用文本测试它:<id><id></id><id/><id /><id><id /><id/><id></id></id></id>
和标签名称: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;
}
最佳答案
所以这是有问题的代码。
currIndexPlaceA = a!.startIndex.successor()..<newText.endIndex;
currIndexPlaceB = b!.startIndex.successor()..<newText.endIndex;
var a = newText.rangeOfString("</" + tagName + ">", options: NSStringCompareOptions.LiteralSearch, range: currIndexPlaceA, locale: nil);
一个明确的错误是在 while
循环外用 var a
声明的 a
和 b
的阴影和 var b
在此 else
block 中。至于您的 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;
}
关于swift LLDB 产生正确的结果,但代码执行的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38967328/