gpt4 book ai didi

swift - 使用 `self` 作为默认参数

转载 作者:IT王子 更新时间:2023-10-29 05:11:18 26 4
gpt4 key购买 nike

我可以在 Swift 中使用 self 作为默认参数吗?这段代码感觉非常简单,但我不明白编译器正在回击的消息:

func printTree(node: TreeNode = self, tabs: String = "") {
println(tabs + node.name!)
node.children.forEach { printTree(node: $0, tabs: tabs+"\t") }
}

错误:

'TreeNode -> () -> TreeNode' is not convertible to 'TreeNode'

嗯?

可能还有其他方法可以解决树遍历问题,但实际上我只是对默认参数限制感到好奇。这是真的吗?文档中是否提到了这一点?我找不到。

更新:

我是从头开始做的,没有任何依赖(我之前有一个类层次结构和一个自定义的 forEach 猴子补丁)。它仍然错误:

class PeanutButterJelly {
var children: [PeanutButterJelly]?
func doDance(){ println("dancing") }
func everybodyDanceNow(pbj: PeanutButterJelly = self) {
pbj.doDance()
if let children = pbj.children {
for child in children { child.doDance() }
}
}
}

错误:

Swift compilation error: unresolved identifier 'self'

Xcode 6.3.2

最佳答案

Can I use self as a default parameter in Swift

没有。这基本上与初始化实例方法时不能说 self 的原因相同:

class TreeNode {
var otherNode : TreeNode = self // Use of unresolved identifier `self`
func printTree(tree:TreeNode = self) { } // Use of unresolved identifier `self`
}

在您定义这个实体(属性或方法)时,没有self这样的东西。之后会有一个 self,当这个方法被 调用 时,在函数的 body 中 - 因为函数将在某个实例上被调用,即 self

做您想做的事情的一种简单方法是使此参数成为可选的,默认值为 nil。然后,在函数体中,检查 nil 并使用 self:

class TreeNode {
func printTree(tree:TreeNode? = nil) {
let treeToPrint = tree ?? self
// do stuff
}
}

现在不带参数调用 printTree 是合法的,它会做你想做的事:

TreeNode().printTree()

关于swift - 使用 `self` 作为默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30798773/

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