可选和非可选不能从返回可选

时间:2016-02-18 02:02:07

标签: ios swift optional

我正在编写一个函数,该函数返回树的下一个节点将来自任何节点,如果进行有序遍历。该函数具有可选的返回,如果没有下一个节点(即我们在最后一个节点处),则需要该返回。我从函数返回一个可选的和非可选的,并且在两个地方都存在编译器错误。这是代码:

class TreeNode<T> 
{
    var leftChild : TreeNode?
    var rightChild : TreeNode?
    var parent : TreeNode?
    var value : T

    init(withValue:T) {
        self.value = withValue
    }

    func nextInOrderNode<T>() -> TreeNode<T>?
    {
        if var nextNode = rightChild
        {
            while nextNode.leftChild != nil {
                nextNode = nextNode.leftChild!
            }
            return nextNode //error 1
        }
        else
        {
            var nextNode = parent
            var currentNode = self
            while nextNode?.rightChild !== currentNode {
                currentNode = nextNode!
                nextNode = nextNode?.parent
            }
            return nextNode //error 2
        }
    }
}

错误是:

error 1: Cannot convert return expression of type 'TreeNode<T>' to return type 'TreeNode<T>?'
error 2: Cannot convert return expression of type 'TreeNode<T>?' to return type 'TreeNode<T>?'

我不确定我在这里做错了什么,因为从我所看到的情况来看,这似乎应该有效。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

该问题与可选与非可选返回值无关。 在

func nextInOrderNode<T>() -> TreeNode<T>?

您在本地方法中引入 new 占位符类型T, 与占位符类型T无关(并隐藏) 在class TreeNode<T>

解决方案很简单: 只需删除方法声明中的占位符:

func nextInOrderNode() -> TreeNode<T>?

您在此处不需要它,因为Tclass TreeNode<T>的范围 是整个类定义,包括所有方法。