首页 > 解决方案 > 实例成员作为默认参数

问题描述

我正在尝试使用属性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
}
}

有人能告诉我为什么我不能使用属性作为默认参数吗?

标签: iosswiftparameters

解决方案


原因是在不同的上下文可见性下,接口函数的参数上下文相对于类声明是外部的,所以成员是不可见的,但是嵌套函数是类上下文中声明的,与其他函数体一样,所以成员是可见的。

所以解决方案可能是静态的,正如已经提出的那样,但它可能有缺点(例如,对于引用默认成员),所以我建议只将它用于常量。

其他可能的解决方案如下

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

推荐阅读