以下编译并运行但文件的值始终为零。这是否意味着您无法在定义默认参数值时执行对象创建?
public func trace(message: String,
var file: NSURL! = NSURL.fileURLWithPath(__FILE__),
function: String = __FUNCTION__) {
let context = NBContext(file: file, function: function)
self.note(message, level: .Trace, context: context)
}
答案 0 :(得分:1)
实例化对象是可能的,因为如果用文件的有效路径替换__FILE__
,它就会按预期工作。它看起来像__FILE__
。
我测试了一个项目,这就是我发现的:
__FILE__
作为原始默认值工作String(__FILE__)
不工作"" + __FILE__
不工作var file: NSURL! = NSURL.fileURLWithPath("<actual-path-of-the-current-file>")
正常工作我可以测试其他版本,但我希望在使用__FILE__
因此,结论是您可以将其指定为默认值,但您必须将其用作原始字符串而不是任何类型的表达式。至于为什么,此刻我不知道(欢迎提出建议)
但是我认为你的函数有一个错误:可以为nil
参数传递file
- 我认为你不希望这种情况发生。更好的方法是:
public func trace(message: String, var file: NSURL? = nil, function: String = __FUNCTION__) {
if file == nil {
file = NSURL.fileURLWithPath(__FILE__)
}
let context = NBContext(file: file, function: function)
self.note(message, level: .Trace, context: context)
}
附录:这是我用于测试的代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
test()
}
func test() {
let x = NBContext(file: nil)
println(x)
}
}
public class NBContext: Printable {
let file: NSURL?
let function: String
let line: Int
let time: NSDate
init (file: NSURL?, function: String = __FUNCTION__, line: Int = __LINE__, time: NSDate = NSDate.date()) {
self.file = file
self.function = function
self.line = line
self.time = time
}
public var description: String {
return "\(time) > " + file!.lastPathComponent + " " + function + ":\(line)"
}
}
这是x