'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
变量的方式。
我是 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
不支持除 String
之外的任何类型。您不能传递,即您的自定义结构/枚举实例作为 NSLog 可变参数。
而是使用 description
变量来显示有关您的实例的必要详细信息。您的 class / struct / enum 也可以符合 CustomStringConvertible
以统一访问 description
变量的方式。