这是我尝试使用的功能
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
没有解决问题
答案 0 :(得分:0)
@MartinR在评论中提出了一个很好的观点:"为什么merge()接受inout参数?参数未被修改,因此这似乎是一种不必要的复杂化。"
错误的原因是您在使用inout
时必须传递确切的类型,而DNode
和DNode?
是两种不同的类型。
newNode
需要声明为可选项,因为这是合并所期望的:
func start(inout newNode: DNode?) {
self.minDNode = merge(&self.minDNode, And: &newNode) // this call now works
}
但是,您可能应该修改代码,删除不需要的inout
次来电。