'NSLog' 不可用:可变函数在 swift 中不可用

'NSLog' is unavailable: Variadic function is unavailable in swift

我是 swift 的新手。当我只学习基础知识时,我在 NSLog

处遇到了这个错误

这是我的代码:

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.
    }


}

如果我这样声明myString

var myString: NSString!

使用NSLog没问题,我也能看到控制台了。

但是像这样声明字符串会导致问题

var myString: NSString?

它反映在 NSLog 并显示错误。

这有什么问题?

如果您将 var myString: NSString? 声明为可选项,那么在将其传递给 NSLog.

之前,您需要确保它具有一个值

所以你可以这样做 NSLog("%@" , myString!)。如果 myString 为 nil 而你输入 ! 程序将崩溃,你将得到

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

但是如果它有一个值,程序将继续正常运行并打印出来

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

我写了myString = "Test"

@Grimxn提到的另一个例子是合并运算符。

NSLog("%@", myString ?? "<nil>")

NSLog() 无法打印 Swift 可选。

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

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

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

通过将 non-optional 值传递给 NSLog() 来修复。

注意:

print() 可以打印Swift可选。

有同样的问题,接受的答案没有帮助。

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

如您所见,可选值没有任何意义。 我猜是因为 <Any> 和任何类型,NSLog 不清楚,看类似的问题 : 。 如果您有解析 NSLog 泛型的解决方案,请编辑此答案。

NSLog 不支持除 String 之外的任何类型。您不能传递,即您的自定义结构/枚举实例作为 NSLog 可变参数。

而是使用 description 变量来显示有关您的实例的必要详细信息。您的 class / struct / enum 也可以符合 CustomStringConvertible 以统一访问 description 变量的方式。