需要帮助使用Swift inout和optional

时间:2015-06-20 14:15:38

标签: swift

这是我尝试使用的功能

func merge(inout A: DNode?, inout And B: DNode?) -> DNode? {
    if A == nil && B == nil {
        return nil
    }
    if A == nil {
        return B
    }
    if B == nil {
        return A
    }
    return A!.isLessThan(B!) ? A! : B!
}

以下是我尝试使用'合并'

的功能
class Heap {
    var minDNode: DNode?

    func start(inout newNode: DNode) {
        self.minDNode = merge(&self.minDNode, And: &newNode) // error
        // Cannot invoke 'merge' with an argument list of type '(inout DNode?, And: inout DNode)'
    }

    func merge(inout A: DNode?, inout And B: DNode?) -> DNode? {
        ...
    }
}

我该如何解决这个问题?

查看Swift optional inout parameters and nil的答案,

制作

var minDNode: DNode? 

var minDNode: DNode? = nil

没有解决问题

1 个答案:

答案 0 :(得分:0)

@MartinR在评论中提出了一个很好的观点:"为什么merge()接受inout参数?参数未被修改,因此这似乎是一种不必要的复杂化。"

错误的原因是您在使用inout时必须传递确切的类型,而DNodeDNode?是两种不同的类型。 newNode需要声明为可选项,因为这是合并所期望的:

func start(inout newNode: DNode?) {
    self.minDNode = merge(&self.minDNode, And: &newNode) // this call now works
}

但是,您可能应该修改代码,删除不需要的inout次来电。