Подтвердить что ты не робот

Как установить условие условных точек останова в Swift с self и enum?

У меня есть перечисление 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
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Есть ли способ решить этот вопрос?

Update:

Он может проверить значение self.request.method с помощью команды LLDB:

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

4b9b3361

Ответ 1

Это довольно явно ошибка lldb. Вы не указываете, какую версию инструментов вы используете. Если вы не используете 6.3.1 или лучше, повторите попытку, используя это. Если вы все еще видите проблему, сообщите об ошибке с помощью http://bugreporter.apple.com.

Примечание. frame var и expr - довольно разные звери. frame var печатает только значения локальных переменных, используя непосредственно информацию об отладке DWARF, но НЕ является оценщиком выражений. Так, например, он не знает достаточно, чтобы сделать ==. Я предполагаю, что если бы вы сделали:

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

когда вы остановились в этой точке останова, вы увидите тот же эффект.

Парсер выражений должен играть дополнительный трюк позирования как метода вашего класса (чтобы получить прозрачные ссылки через self и т.д.), и это немного сложно сделать правильно. По-видимому, мы не делаем работу правильно в вашем случае.