2015-04-25 5 views
13

ho un enum di metodi HTTP:Come impostare la condizione dei breakpoint condizionali in Swift con self ed enum?

enum HTTPMethod: String { 
    case GET = "GET" 
    case POST = "POST" 
} 

e ho una classe di richiesta e di una classe richiesta di avvolgitore:

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 
    } 
} 

Ho impostato un punto di interruzione condizionale sulla linea:

return request.method.rawValue == incomingRequest.HTTPMethod 

con condizione:

self.request.method == HTTPMethod.POST 

e quindi la fermata debugger alla linea, con un messaggio di errore:

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 

E se elimino self e cambiare la condizione:

request.method == HTTPMethod.POST 

messaggio di errore è come le seguenti linee:

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 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

C'è un modo per risolvere questa domanda?

Aggiornamento:

E 'in grado di controllare il valore di self.request.method utilizzando il comando LLDB:

fr v self.request.method 

E se uso una costante locale per memorizzare il valore, il debugger può essere fermato al giusta posizione:

// Use a local constant to store the HTTP method 
let method = request.method 

// Condition of breakpoint 
method == HTTPMethod.POST 

Aggiornamento 2:

Sto usando Xcode 6.3.1

risposta

2

Questo è chiaramente un bug lldb. Non menzioni quale versione degli strumenti stai usando. Se non utilizzi la versione 6.3.1 o successiva, riprova ad utilizzarla. Se vedi ancora un problema, segnala un bug con http://bugreporter.apple.com.

Note, frame var e expr sono animali molto diversi. frame var stampa solo i valori delle variabili locali, utilizzando direttamente le informazioni di debug di DWARF, ma NON è un analizzatore di espressioni. Quindi, per esempio, non sa abbastanza da fare ==. Immagino che se l'hai fatto:

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

quando fermato a quel punto di interruzione si vedrebbe lo stesso effetto.

L'analizzatore di espressioni deve svolgere il trucco extra di proporre un metodo della classe (per ottenere riferimenti trasparenti tramite il sé, ecc. Per funzionare) e, è un po 'complicato farlo correttamente. Apparentemente non stiamo facendo il lavoro correttamente nel tuo caso.