Swift Language
Вход в Swift
Поиск…
замечания
println
и debugPrintln
где удалено в Swift 2.0.
Источники:
https://developer.apple.com/library/content/technotes/tn2347/_index.html http://ericasadun.com/2015/05/22/swift-logging/
Отладка печати
Debug Print показывает представление экземпляра, наиболее подходящее для отладки.
print("Hello")
debugPrint("Hello")
let dict = ["foo": 1, "bar": 2]
print(dict)
debugPrint(dict)
Урожайность
>>> Hello
>>> "Hello"
>>> [foo: 1, bar: 2]
>>> ["foo": 1, "bar": 2]
Эта дополнительная информация может быть очень важной, например:
let wordArray = ["foo", "bar", "food, bars"]
print(wordArray)
debugPrint(wordArray)
Урожайность
>>> [foo, bar, food, bars]
>>> ["foo", "bar", "food, bars"]
Обратите внимание, как на первом выходе появляется, что в массиве есть 4 элемента, а не 3. Для таких целей предпочтительнее, когда отладка используется debugPrint
Обновление классов для отладки и печати значений
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
свалка
dump
печатает содержимое объекта посредством отражения (зеркалирования).
Детальный вид массива:
let names = ["Joe", "Jane", "Jim", "Joyce"]
dump(names)
Печать:
▿ 4 элемента
- [0]: Джо
- [1]: Джейн
- [2]: Джим
- [3]: Джойс
Для словаря:
let attributes = ["foo": 10, "bar": 33, "baz": 42]
dump(attributes)
Печать:
▿ 3 пары ключ / значение
▿ [0]: (2 элемента)
- .0: bar
- .1: 33
▿ [1]: (2 элемента)
- .0: baz
- .1: 42
▿ [2]: (2 элемента)
- .0: foo
- .1: 10
dump
объявлен как dump(_:name:indent:maxDepth:maxItems:)
.
Первый параметр не имеет метки.
Доступны другие параметры, такие как name
для установки метки для проверяемого объекта:
dump(attributes, name: "mirroring")
Печать:
▿ зеркалирование: 3 пары ключ / значение
▿ [0]: (2 элемента)
- .0: bar
- .1: 33
▿ [1]: (2 элемента)
- .0: baz
- .1: 42
▿ [2]: (2 элемента)
- .0: foo
- .1: 10
Вы также можете печатать только определенное количество элементов с помощью maxItems:
чтобы проанализировать объект до определенной глубины с помощью maxDepth:
и изменить отступ отпечатанных объектов с помощью indent:
print () vs dump ()
Многие из нас начинают отладку с помощью простого print()
. Допустим, у нас такой класс:
class Abc {
let a = "aa"
let b = "bb"
}
и у нас есть экземпляр Abc
как таковой:
let abc = Abc()
Когда мы запускаем print()
для переменной, выход
App.Abc
а выходы dump()
App.Abc #0
- a: "aa"
- b: "bb"
Как видно, dump()
выводит всю иерархию классов, а print()
просто выводит имя класса.
Поэтому dump()
особенно полезен для отладки пользовательского интерфейса
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
С dump(view)
мы получаем:
- <UIView: 0x108a0cde0; frame = (0 0; 100 100); layer = <CALayer: 0x159340cb0>> #0
- super: UIResponder
- NSObject
Во время print(view)
мы получаем:
<UIView: 0x108a0cde0; frame = (0 0; 100 100); layer = <CALayer: 0x159340cb0>>
Больше информации о классе с dump()
, и поэтому он более полезен при отладке самого класса.
печать против NSLog
В быстром режиме мы можем использовать функции print()
и NSLog()
для печати на консоли Xcode.
Но есть много отличий в функциях print()
и NSLog()
, таких как:
1 TimeStamp: NSLog()
будет печатать метку времени вместе с переданной ей строкой, но print()
не будет печатать метку времени.
например
let array = [1, 2, 3, 4, 5]
print(array)
NSLog(array.description)
Выход:
[1, 2, 3, 4, 5]
2017-05-31 13: 14: 38.582 ProjetName [2286: 7473287] [1, 2, 3, 4, 5]
Он также будет печатать имя проекта вместе с меткой времени.
2 Только строка: NSLog()
принимает только String как вход, но print()
может печатать любые входные данные, переданные ему.
например
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 Производительность: функция NSLog()
работает очень медленно по сравнению с функцией print()
.
4 Синхронизация: NSLog()
обрабатывает одновременное использование из многопоточной среды и выводит результат без перекрытия. Но print()
не будет обрабатывать такие случаи и сжиматься при выводе prating.
5 Консоль устройств: выходы NSLog()
на консоли устройства также можно увидеть, подключив наше устройство к Xcode. print()
не будет выводить вывод на консоль устройства.