我有一个HTTP方法枚举:
enum HTTPMethod: String { case GET = "GET" case POST = "POST" }
我有一个请求类和一个请求包装类:
class Request { let method: HTTPMethod = .GET } class RequestWrapper { let request: Request func compareToRequest(incomingRequest: NSURLRequest) -> Bool { // Next line is where the conditional breakpoint set. return request.method.rawValue == incomingRequest.HTTPMethod } }
我在这个行上设置了一个条件断点:
return request.method.rawValue == incomingRequest.HTTPMethod
条件:
self.request.method == HTTPMethod.POST
Stopped due to an error evaluating condition of breakpoint 1.1: "self.request.method == HTTPMethod.POST" Couldn't parse conditional expression: <EXPR>:1:1: error: use of unresolved identifier 'self' self.request.HTTPMethod == HTTPMethod.POST
如果我删除自己,并将条件更改为:
request.method == HTTPMethod.POST
错误信息如下:
Stopped due to an error evaluating condition of breakpoint 1.1: "request.method == HTTPMethod.POST" Couldn't parse conditional expression: <EXPR>:1:1: error: could not find member 'method' request.method == HTTPMethod.POST ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有没有办法解决这个问题?
更新:
可以使用LLDB命令检查self.request.method的值:
fr v self.request.method
如果我使用本地常量来存储值,调试器可以停在正确的位置:
// Use a local constant to store the HTTP method let method = request.method // Condition of breakpoint method == HTTPMethod.POST
更新2:
我正在使用Xcode 6.3.1
解决方法
这显然是一个lldb bug.你没有提到你正在使用什么版本的工具.如果您没有使用6.3.1或更高版本,请再试一次.如果您仍然遇到问题,请提交
http://bugreporter.apple.com的错误.
注意,框架var和expr是相当不同的野兽. frame var仅打印局部变量的值,直接使用DWARF调试信息,但不是表达式求值程序.所以,例如,它不够了解==.我想像如果你这样做:
(lldb) self.request.method == HTTPMethod.POST
当在那个断点停止时,你会看到相同的效果.
表达式解析器必须扮演一个额外的技巧,作为你的类的方法(通过自我等获得透明的引用),而且这是一个有点棘手的事情.显然我们没有在你的情况下正确地做这个工作.