swift LLDB 产生正确的结果,但代码执行的结果不同

标签 swift

我遇到了一个奇怪的行为......

简而言之 - 在应用程序代码中运行此命令(在 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 声明的 ab 的阴影和 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/

相关文章:

ios - 每周特定日期的 NSDate 扩展

ios - 通过 Stripe 付款错误显示在 html Swift 中

ios - 在 Swift 中更新未选择的 tabBarItem 的角标(Badge)

ios - 在 iOS/Swift 中首次启动应用程序之前设置默认语言

ios - 将 UISearchController 连接到 UISearchBar,而不将搜索栏嵌入到表格 View 或导航栏中

ios - 在 swift 中无法使用 MICountry 选择器的 dial_code

ios - Swift、Json Dictionary<String, AnyObject> 将值发送到标签

ios - 无法将类型 'MyClass' 的值分配给类型 'MFMailComposeViewControllerDelegate!' 的值

Swift - 参数必须符合协议(protocol)且检查为 kindOf 的函数

ios - 如何在 Realm Swift 中进行嵌套查询?