2016-07-15 99 views
5

Sto leggendo l'articolo Dancing in the Debugger — A Waltz with LLDB. E sto provando il comando thread return con Swift 2.2 e Swift 3.0.Il comando 'thread return' di LLDB emette un errore in una funzione Swift

Il mio codice è piuttosto semplice:

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let resust = test() 
     print(resust) 
    } 

    func test() -> Bool { 
     return true 
    } 
} 

e ho aggiunto un punto di interruzione all'inizio della funzione test() con un'azione thread return false. Tuttavia, dopo il comando + R, il mio programma si ferma al punto di interruzione come previsto, ma con il seguente errore:

"errore: Errore di ritorno dal frame 0 del thread 1: supportiamo solo l'impostazione di tipi interi semplici e di tipo float al momento .."

Ecco uno screenshot:

codesnapshot1

poi ho provato lo stesso nel codice Objective-C; tutto va bene.

+0

Swift 'Bool' s sono implementati come una struct, quindi non è un "simple integer and float return type". Funziona in ObjC perché un ObjC 'BOOL' è solo un typedef di un tipo primitivo. – dan

+0

Ho provato 'thread return 10 (o altro numero)' come azione, tuttavia il programma si è fermato ancora con lo stesso errore. :( – oneMortale

+0

Forse è implicitamente convertito in valore booleano poiché i contenitori Swift sono sicuri per il tipo? – Leviathlon

risposta

4

Questi sono noti bug. I tipi di valore in swift (Int, Bool, ecc.) Sono tutti oggetti complessi e non abbiamo insegnato a lldb come sovrascrivere i valori di ritorno per essi. Anche la gestione degli errori renderà questo difficile.

In generale, i rimpatri forzati non sono sicuri - a maggior ragione con ARC e ancor di più con la Swift, in quanto si rischia di sbilanciare i conteggi di riferimento -. Non solo locali, ma potenzialmente gli oggetti passati in