gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:27:58 28 4
gpt4 key购买 nike

下面编译并运行,但文件的值始终为零。这是否意味着您不能将对象创建作为定义默认参数值的一部分?

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

最佳答案

实例化一个对象是可能的,因为如果你替换__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

关于ios - 在 Swift 中分配默认参数值时创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835264/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com