在Swift中分配默认参数值时创建对象

时间:2014-09-14 16:11:42

标签: ios swift

以下编译并运行但文件的值始终为零。这是否意味着您无法在定义默认参数值时执行对象创建?

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

1 个答案:

答案 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

的内容

enter image description here