HomeiOS DevelopmentLogging for freshmen in Swift

Logging for freshmen in Swift


Discover ways to print variables to the debug console utilizing completely different capabilities akin to print, dump, NSLog and the unified os.log API.

Swift

Fundamental output in Swift utilizing print

The very first methodology I would like to indicate you is the print perform. It might write the textual illustration of the given gadgets to the usual output. In different phrases we will merely say that it could print textual content to the display. A lot of the whats up phrase applications make the most of this methodology to show the well-known “Howdy world!” message. In Swift, print is sort of a strong methodology, since you may go round a number of gadgets for printing out plus you may specify a separator string and a terminator parameter. 🤔

print("Howdy World!")

The snippet above will show the Howdy World! textual content adopted by a newline character (n), it is because the default terminator is at all times a newline. You may override this conduct by offering your personal terminator string.

print("Howdy World!", terminator: "")

In the event you run this instance utilizing Xcode it’s best to see that the “Program ended with exit code: 0” textual content will seem in a newline within the first case, however within the second situation it’s going to be printed out proper after the “Howdy World!” sentence. In the event you run this system utilizing a Terminal software, a % character be current as an alternative of the brand new line within the second case. 💡

What about printing out a number of variables? It’s doable to present a number of gadgets to the print perform, they are often actually something, print can deal with strings, integers and all types of different variables. Print below the hood will convert the variable into a correct string illustration, so you do not have to fiddle with kind casting on a regular basis, however merely print out something.

print(1, 2, 3, 4, 5)


print(1, "two", 3.14, true)

It’s also possible to customise the separator character by means of an argument. So in the event you want a coma character (adopted by an area) in between the weather, you may write one thing like this:

print("a", "b", "c", separator: ", ")

Effectively, in my earlier article you’ve got seen assemble numerous strings utilizing literals and interpolation, you need to use all these variables to print out stuff to the console.

print("""
            __
           / _)
    .-^^^-/ /
 __/       /
<__.|_|-|_|
""")

For instance, this is a cute multi-line ascii artwork dinosaur. 🦕



Debugging and print

Generally it might be cool to know just a bit bit of additional information in regards to the printed variable, that is when debugPrint can assist you. The principle distinction between print and debugPrint is that whereas print merely converts all the things to string, debug print will provide you with a short debug information in regards to the given gadgets. The debugPrint methodology will print out numbers similar to print does, it’s going to add double quotes round strings, and it will print some further information about a lot of the different “complicated” varieties.

print(1) 
debugPrint(1) 

print("foo") 
debugPrint("foo") 

print(1...5) 
debugPrint(1...5) 

Actually I’ve nearly by no means used this methodology, and I at all times most well-liked print if I needed to print out one thing to the console, but it surely’s at all times good to know that there’s such an choice obtainable built-in to the usual library, nonetheless there’s a methodology that may give you far more information… 🧐



Debugging utilizing dump

The dump methodology can print out the given object’s content material utilizing its mirror to the usual output. Lengthy story quick, this perform will present you a extra detailed view in regards to the property. For scalar values the dump methodology will produce nearly the identical output as debug-print, besides the dump line at all times begins with a touch character, however for extra complicated varieties it’s going to output the underlying construction of the article. Don’t be concerned, you needn’t perceive the output of this methodology, simply do not forget that it could present you useful information throughout debugging. 🐞

dump(1)
dump(3.14)
dump("foo")
dump(1...5)

The ClosedRange struct is a built-in kind with a lowerBound and an upperBound property. Whereas the print perform solely returned the outlined vary (1…5), the debugPrint methodology additionally revealed the kind of the article, dump takes this one step additional by displaying us the precise decrease and higher certain properties of the worth. This may be extraordinarily useful when you’ve got a posh kind with a number of underlying properties that you just need to rapidly examine for some cause. 🔍

By the way in which, debugging is the act of discovering (and resolving) bugs. Bugs are issues in your program code that stop regular operation. Builders can use debugger instruments to run and examine code step-by-step, line by line or per instruction, however most of them are merely placing print statements into the code to see the present state or results of a given perform. 🤷‍♂️

Dump has a couple of extra perform arguments you could configure:

dump("check", title: "my-variable", indent: 4, maxDepth: 5, maxItems: 5)

You may give a reputation to every dumped variable, add some further indentation earlier than the sprint character, specify the utmost depth for descendents and the utmost variety of parts for which to write down the complete contents. Be at liberty to play with these parameters for some time. 😉

As you may see dump is sort of a strong methodology, however nonetheless there are different capabilities for logging functions, let me present you one that’s coming from the Goal-C instances.



NSLog – the legacy logger perform

You probably have ever labored with Goal-C try to be accustomed to the NS prefixes. The NSLog perform can log an error message to the Apple System Log facility console. It isn’t a part of the Swift normal library, however you need to import the Basis framework with a purpose to use NSLog.

import Basis

NSLog("I am a dinosaur.")


You need to know that NSLog will print the present date & time first, then it’s going to show the title of the operating program with the method and thread identifiers and solely then it’s going to print your message.

Simply to be clear, NSLog is coming from the Goal-C period, it isn’t a advisable logging answer anymore. It’s also very gradual and that may trigger some points in the event you want exactly timed outputs. That is why I do NOT advocate utilizing NSLog in any respect, however you additionally need to know that till a couple of years in the past there was no higher built-in different for it, I am not judging, simply saying… 😅




Unified Logging and Exercise Tracing

If you wish to ship log messages on an Apple machine to the unified logging system, you need to use the OSLog framework. This new device was launched at WWDC 2016 and just lately acquired some good API refinements & updates. You need to positively examine the OSLog and Unified Logging advisable by Apple article if you wish to be taught extra about this matter it is an important write up.

My solely concern about this logging API is that it isn’t that common. It really works nice on Apple platforms, however since Swift is an common language if you wish to add Linux and even Home windows assist, this answer will not be just right for you…





SwiftLog – A Logging API bundle for Swift

This open supply bundle could be simply built-in into your Swift tasks through the Swift Package deal Supervisor. You simply need to set it up as a dependency within the Package deal.swift manifest file or you may hook it utilizing Xcode below the File > Swift Packages menu as an SPM dependency.


import PackageDescription

let bundle = Package deal(
    title: "myProject",
    dependencies: [
        .package(url: "https://github.com/apple/swift-log.git", from: "1.4.0"),
    ],
    targets: [
        .target(name: "myProject", dependencies: [
            .product(name: "Logging", package: "swift-log")
        ])
    ]
)

The utilization is basically easy. First you need to import the Logging framework, then you definitely create a logger and you utilize that logger occasion to print out numerous log messages.


import Logging

let logger = Logger(label: "app-identifier")

logger.information("Howdy World!")

The next log ranges are supported:

  • hint
  • debug
  • information
  • discover
  • warning
  • error
  • essential

It’s also possible to connect extra logging metadata to the logger, it’s best to examine the readme for more information about this selection. SwiftLog is utilized in many real-world tasks, akin to Vapor 4 (a server facet Swift framework), this additionally implies that it really works nice on Linux working programs. 🐧


Conclusion

If it involves logging, there are a number of good choices to select from. It solely is dependent upon your wants which one is the very best, however on the whole we will say that it’s time to go away behind NSLog, and time to make use of the brand new OSLog framework. In case you are utilizing Swift on non-Apple platform it’s best to think about using the SwiftLog library, which can also be supplied by Apple.

Alternatively if you’re simply scratching the floor and you do not want that many choices or log ranges you may merely follow print and dump statements. It is completely positive to debug utilizing these easy strategies to start with. Mastering one thing takes time and debuggers could be fairly scary at first sight. Use print as a lot as you want, however at all times attempt to enhance your instruments & data over time, I hope this text provides you a greater view of the obtainable logging instruments. 🤓




RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments