Saturday, October 14, 2023
HomeiOS DevelopmentLogging for freshmen in Swift

Logging for freshmen in Swift


Learn to print variables to the debug console utilizing totally different capabilities corresponding to print, dump, NSLog and the unified os.log API.

Swift

Fundamental output in Swift utilizing print

The very first technique I would like to indicate you is the print perform. It could possibly write the textual illustration of the given objects to the usual output. In different phrases we are able to merely say that it might probably print textual content to the display screen. A lot of the hey phrase applications make the most of this technique to show the well-known “Good day world!” message. In Swift, print is sort of a robust technique, since you’ll be able to cross round a number of objects for printing out plus you’ll be able to specify a separator string and a terminator parameter. 🤔

print("Good day World!")

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

print("Good day 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 state of affairs it will be printed out proper after the “Good day 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 potential to provide a number of objects to the print perform, they are often actually something, print can deal with strings, integers and all types of different variables. Print underneath 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)

You can too 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’ll be able to write one thing like this:

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

Properly, in my earlier article you may have 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 will 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 every part to string, debug print provides you with a short debug information in regards to the given objects. The debugPrint technique will print out numbers similar to print does, it will add double quotes round strings, and it will print some additional information about a lot of the different “advanced” varieties.

print(1) 
debugPrint(1) 

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

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

Truthfully I’ve virtually by no means used this technique, and I at all times most popular 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 accessible built-in to the usual library, nevertheless there’s a technique that may give you far more information… 🧐



Debugging utilizing dump

The dump technique 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 technique will produce virtually the identical output as debug-print, besides the dump line at all times begins with a touch character, however for extra advanced varieties it will output the underlying construction of the thing. Don’t be concerned, you needn’t perceive the output of this technique, simply keep in mind that it might probably 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 technique additionally revealed the kind of the thing, dump takes this one step additional by exhibiting us the precise decrease and higher certain properties of the worth. This may be extraordinarily useful when you may have a fancy kind with a number of underlying properties that you simply need to shortly examine for some motive. 🔍

By the way in which, debugging is the act of discovering (and resolving) bugs. Bugs are issues in your program code that forestall 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 can configure:

dump("take a look at", title: "my-variable", indent: 4, maxDepth: 5, maxItems: 5)

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

As you’ll be able to see dump is sort of a robust technique, however nonetheless there are different capabilities for logging functions, let me present you one that’s coming from the Goal-C occasions.



NSLog – the legacy logger perform

When you have ever labored with Goal-C you need to be aware of 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 customary library, however you must import the Basis framework with the intention to use NSLog.

import Basis

NSLog("I am a dinosaur.")


It is best to know that NSLog will print the present date & time first, then it will show the title of the operating program with the method and thread identifiers and solely then it will print your message.

Simply to be clear, NSLog is coming from the Goal-C period, it’s not a advisable logging answer anymore. Additionally it is very gradual and that may trigger some points in the event you want exactly timed outputs. That is why I do NOT suggest utilizing NSLog in any respect, however you additionally should know that till a couple of years in the past there was no higher built-in various 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 software was launched at WWDC 2016 and not too long ago acquired some good API refinements & updates. It is best to positively verify the OSLog and Unified Logging advisable by Apple article if you wish to study extra about this subject it is an amazing write up.

My solely concern about this logging API is that it’s not 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 give you the results you want…





SwiftLog – A Logging API bundle for Swift

This open supply bundle may be simply built-in into your Swift tasks through the Swift Bundle Supervisor. You simply should set it up as a dependency within the Bundle.swift manifest file or you’ll be able to hook it utilizing Xcode underneath the File > Swift Packages menu as an SPM dependency.


import PackageDescription

let bundle = Bundle(
    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 actually easy. First you must import the Logging framework, you then 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("Good day World!")

The next log ranges are supported:

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

You can too connect extra logging metadata to the logger, it’s best to verify the readme for more information about this feature. SwiftLog is utilized in many real-world tasks, corresponding to Vapor 4 (a server aspect Swift framework), this additionally signifies that it really works nice on Linux working methods. 🐧


Conclusion

If it involves logging, there are a number of good choices to select from. It solely relies on your wants which one is one of the best, however usually we are able to say that it’s time to depart behind NSLog, and time to make use of the brand new OSLog framework. If you’re utilizing Swift on non-Apple platform it’s best to think about using the SwiftLog library, which can be offered by Apple.

Alternatively if you’re simply scratching the floor and you do not want that many choices or log ranges you’ll be able to merely persist with print and dump statements. It is completely high quality to debug utilizing these easy methods at first. Mastering one thing takes time and debuggers may be fairly horrifying at first sight. Use print as a lot as you want, however at all times attempt to enhance your instruments & information over time, I hope this text offers you a greater view of the accessible logging instruments. 🤓






Supply hyperlink

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments