这是我尝试使用的功能
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
没有解决问题
最佳答案
@MartinR 在评论中提出了一个很好的观点:“为什么 merge() 接受 inout 参数?参数没有被修改,所以这看起来是一个不必要的复杂化。”
错误的原因是使用inout
时必须传递准确的类型,而DNode
和DNode?
是两个不同的类型。
newNode
需要声明为可选,因为这是合并所期望的:
func start(inout newNode: DNode?) {
self.minDNode = merge(&self.minDNode, And: &newNode) // this call now works
}
不过,您可能应该重新编写代码,以删除不需要的 inout
调用。
关于swift - 需要帮助使用 Swift inout 和可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30954955/