'NSLog' is unavailable: Variadic function is unavailable in swift
Asked Answered
H

4

40

I'm new to swift. when I'm learning just basics I got this error at NSLog

Here is my code :

import UIKit

class ViewController: UIViewController {
    
     var myString: NSString?

    override func viewDidLoad() {
        super.viewDidLoad()
        myString = "himanth"
        print(myString)
        NSLog("%@" , myString)
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

If I am declaring myString like this

var myString: NSString!

It's fine to use NSLog and I can able to see console as well.

But declaring string like this causing problem

var myString: NSString?

It reflects at NSLog and showing error.

What is the problem with that?

Hescock answered 3/10, 2016 at 8:14 Comment(0)
G
27

If you declare var myString: NSString? as an optional then you need to make sure it has a value before you pass it to the NSLog.

So you could do it like this then NSLog("%@" , myString!). If myString is nil and you put ! the program will crash and you will get

fatal error: unexpectedly found nil while unwrapping an Optional value.

But if it has a value the program will continue as normal and print out

2016-10-03 10:26:25.077 Swift3.0[65214:1579363] Test

I wrote myString = "Test".

Another example as @Grimxn mentioned is the coalescing operator.

NSLog("%@", myString ?? "<nil>")
Gasper answered 3/10, 2016 at 8:27 Comment(2)
Better to use NSLog("%@", myString ?? "<nil>") surely?Fyke
That´s absolutely an alternative @FykeGasper
M
20

NSLog() cannot print Swift Optionals.

let optional: String?
NSLog("%@", optional) // 'NSLog' is unavailable: Variadic function is unavailable

let nonOptional: String
NSLog("%@", nonOptional) // Ok!

NSLog("%@", optional ?? "value-if-nil") // Ok!

Fix by passing a non-optional value to NSLog() instead.

NOTE:

print() can print Swift Optionals.

Mahound answered 15/1, 2017 at 22:20 Comment(0)
A
3

Have the same problem, accepted answer doesn't help.

func handleSomeResp(_ response: DataResponse<Any>) {
    NSLog("handle error: %@", response)
}

as you see, there is nothing about optionals. I guess it because of <Any>, and any type, unclear for NSLog, watch similar problem here: . Edit this answer if you have a solution to parse generics for NSLog.

Aviv answered 13/2, 2019 at 12:14 Comment(0)
C
1

NSLog does not support any types except String. You cannot pass, i.e. your custom struct / enum instance as NSLog variadic argument.

Instead use description variable to show up necessary details about your instance. Your class / struct / enum could conform CustomStringConvertible to unify the way to access description variable as well.

Chiropractor answered 28/9, 2021 at 15:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.