Swift Language
Accesso a Swift
Ricerca…
Osservazioni
println
e debugPrintln
dove rimosso in Swift 2.0.
fonti:
https://developer.apple.com/library/content/technotes/tn2347/_index.html http://ericasadun.com/2015/05/22/swift-logging/
Debug Print
Debug Print mostra la rappresentazione dell'istanza più adatta per il debug.
print("Hello")
debugPrint("Hello")
let dict = ["foo": 1, "bar": 2]
print(dict)
debugPrint(dict)
I rendimenti
>>> Hello
>>> "Hello"
>>> [foo: 1, bar: 2]
>>> ["foo": 1, "bar": 2]
Questa informazione extra può essere molto importante, ad esempio:
let wordArray = ["foo", "bar", "food, bars"]
print(wordArray)
debugPrint(wordArray)
I rendimenti
>>> [foo, bar, food, bars]
>>> ["foo", "bar", "food, bars"]
Si noti come nel primo output ci siano 4 elementi nell'array rispetto a 3. Per ragioni come questa, è preferibile eseguire il debug per usare debugPrint
Aggiornamento di un debug di classi e stampa dei valori
struct Foo: Printable, DebugPrintable {
var description: String {return "Clear description of the object"}
var debugDescription: String {return "Helpful message for debugging"}
}
var foo = Foo()
print(foo)
debugPrint(foo)
>>> Clear description of the object
>>> Helpful message for debugging
cumulo di rifiuti
dump
stampa il contenuto di un oggetto tramite riflessione (mirroring).
Vista dettagliata di un array:
let names = ["Joe", "Jane", "Jim", "Joyce"]
dump(names)
stampe:
▿ 4 elementi
- [0]: Joe
- [1]: Jane
- [2]: Jim
- [3]: Joyce
Per un dizionario:
let attributes = ["foo": 10, "bar": 33, "baz": 42]
dump(attributes)
stampe:
▿ 3 coppie chiave / valore
▿ [0]: (2 elementi)
- .0: bar
- .1: 33
▿ [1]: (2 elementi)
- .0: baz
- .1: 42
▿ [2]: (2 elementi)
- .0: pippo
- .1: 10
dump
è dichiarato come dump(_:name:indent:maxDepth:maxItems:)
.
Il primo parametro non ha etichetta.
Sono disponibili altri parametri, come il name
per impostare un'etichetta per l'oggetto da ispezionare:
dump(attributes, name: "mirroring")
stampe:
▿ mirroring: 3 coppie chiave / valore
▿ [0]: (2 elementi)
- .0: bar
- .1: 33
▿ [1]: (2 elementi)
- .0: baz
- .1: 42
▿ [2]: (2 elementi)
- .0: pippo
- .1: 10
Puoi anche scegliere di stampare solo un determinato numero di elementi con maxItems:
per analizzare l'oggetto fino a una certa profondità con maxDepth:
e per modificare il rientro degli oggetti stampati con il indent:
print () vs dump ()
Molti di noi iniziano il debugging con la semplice print()
. Diciamo che abbiamo una classe simile:
class Abc {
let a = "aa"
let b = "bb"
}
e abbiamo un'istanza di Abc
in questo modo:
let abc = Abc()
Quando eseguiamo print()
sulla variabile, l'output è
App.Abc
mentre output dump()
App.Abc #0
- a: "aa"
- b: "bb"
Come visto, dump()
restituisce l'intera gerarchia delle classi, mentre print()
restituisce semplicemente il nome della classe.
Pertanto, dump()
è particolarmente utile per il debug dell'interfaccia utente
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
Con dump(view)
otteniamo:
- <UIView: 0x108a0cde0; frame = (0 0; 100 100); layer = <CALayer: 0x159340cb0>> #0
- super: UIResponder
- NSObject
Durante la print(view)
otteniamo:
<UIView: 0x108a0cde0; frame = (0 0; 100 100); layer = <CALayer: 0x159340cb0>>
Ci sono più informazioni sulla classe con dump()
, e quindi è più utile nel debug della classe stessa.
print vs NSLog
In swift possiamo usare entrambe print()
funzioni print()
e NSLog()
per stampare qualcosa sulla console Xcode.
Ma ci sono molte differenze nelle funzioni print()
e NSLog()
, come ad esempio:
1 TimeStamp: NSLog()
stamperà la data e l'ora con la stringa passata, ma print()
non stamperà la data / ora.
per esempio
let array = [1, 2, 3, 4, 5]
print(array)
NSLog(array.description)
Produzione:
[1, 2, 3, 4, 5]
2017-05-31 13: 14: 38.582 ProjetName [2286: 7473287] [1, 2, 3, 4, 5]
Stamperà anche ProjectName con timestamp.
2 Solo stringa: NSLog()
accetta solo String come input, ma print()
può stampare qualsiasi tipo di input passato ad esso.
per esempio
let array = [1, 2, 3, 4, 5]
print(array) //prints [1, 2, 3, 4, 5]
NSLog(array) //error: Cannot convert value of type [Int] to expected argument type 'String'
3 Prestazioni: la funzione NSLog()
è molto lenta rispetto alla funzione print()
.
4 Sincronizzazione: NSLog()
gestisce l'utilizzo simultaneo dall'ambiente multi-threading e stampa l'output senza sovrapporlo. Ma print()
non gestirà tali casi e non guasta mentre mostra l'output.
5 Console dispositivo: NSLog()
output NSLog()
sulla console del dispositivo, possiamo vedere questa uscita collegando il nostro dispositivo a Xcode. print()
non stampa l'output sulla console del dispositivo.