ios - 实例成员作为默认参数
问题描述
我正在尝试使用属性root
作为函数中的默认参数,add
如下所示,它给了我一个错误:
不能使用实例成员 'root' 作为默认参数。
但是,当我root
在嵌套函数中使用时,search
它工作正常。
class Trie {
var root = TrieNode()
func add(value: String, node: TrieNode? = root) { // error
var myNode = node
if myNode == nil {
myNode = root
}
if value.count == 0 {
node?.setEnd()
return
} else if myNode!.keys[String(value.first!)] == nil {
myNode!.keys[String(value.first!)] = TrieNode()
return add(value: String(value.dropFirst()), node: myNode!.keys[String(value.first!)])
} else {
return add(value: String(value.dropFirst()), node: myNode!.keys[String(value.first!)])
}
}
func allWords() -> [String] {
var words = [String]()
func search(node: TrieNode = root, string: String) { // Here it is working fine.
if node.keys.count != 0 {
for key in node.keys.keys {
search(node: node.keys[key]!, string: string+key)
}
if node.isEnd {
words.append(string)
}
} else {
if string.count > 0 {
words.append(string)
}
}
}
search(node: self.root, string: "")
return words
}
}
有人能告诉我为什么我不能使用属性作为默认参数吗?
解决方案
原因是在不同的上下文可见性下,接口函数的参数上下文相对于类声明是外部的,所以成员是不可见的,但是嵌套函数是在类上下文中声明的,与其他函数体一样,所以成员是可见的。
所以解决方案可能是静态的,正如已经提出的那样,但它可能有缺点(例如,对于引用默认成员),所以我建议只将它用于常量。
其他可能的解决方案如下
func add(value: String, node: TrieNode?) { // no error
func _add(value: String, node: TrieNode? = root) { // in-context
var myNode = node
if myNode == nil {
myNode = root
}
if value.count == 0 {
node?.setEnd()
return
} else if myNode!.keys[String(value.first!)] == nil {
myNode!.keys[String(value.first!)] = TrieNode()
return add(value: String(value.dropFirst()), node: myNode!.keys[String(value.first!)])
} else {
return add(value: String(value.dropFirst()), node: myNode!.keys[String(value.first!)])
}
}
_add(value: value, node: node)
}
推荐阅读
- python - AWS Serverless - 添加响应标头
- python - 在python中编写描述符
- git - 如何使用 PowerShell 在 Azure DevOps 管道中运行 git push?
- android - 列表项不会出现在屏幕上,而是打印在控制台上
- cloud - Cloudera CDP 私有云 - 在主机上安装失败
- javascript - 您可以从 Amazon s3 中提取文件而不在文件中进行硬编码吗?
- python - 修复 ezgmail 的 ModuleNotFoundError
- c# - 从主窗体的托盘图标上打开另一个窗体
- intellij-idea - Spock 2.0 正在报告数据驱动测试的额外测试
- r - 在 R 中聚合顺序和分组数据