如何使用self和enum在Swift中设置条件断点的条件?

时间:2015-04-25 08:44:49

标签: ios swift debugging enums lldb

我有一个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

如果我删除self并将条件更改为:

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

1 个答案:

答案 0 :(得分:2)

这显然是一个lldb错误。您没有提到您正在使用的工具版本。如果您没有使用6.3.1或更高版本,请再试一次。如果您仍然遇到问题,请提交http://bugreporter.apple.com的错误。

注意,frame varexpr是完全不同的野兽。 frame var仅使用DWARF调试信息直接打印局部变量的值,但不是表达式求值程序。因此,例如,它不够了解==。我想如果你这样做了:

(lldb) self.request.method == HTTPMethod.POST

当在该断点处停止时,您会看到相同的效果。

表达式解析器必须发挥作为你的类的方法冒充的额外技巧(通过自我等工作获得透明引用),并且这样做有点棘手。显然我们没有正确地完成你的工作。

相关问题