swift - 需要帮助使用 Swift inout 和可选

标签 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

没有解决问题

最佳答案

@MartinR 在评论中提出了一个很好的观点:“为什么 merge() 接受 inout 参数?参数没有被修改,所以这看起来是一个不必要的复杂化。”

错误的原因是使用inout时必须传递准确的类型,而DNodeDNode?是两个不同的类型。 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/

相关文章:

swift - 在 UIAlertController 被关闭后执行 segue

swift - `AnyObject` 在语言中有特殊意义吗?

ios - Swift 崩溃报告对我来说没有意义

ios - Swift 协议(protocol)与 objective-c ViewController 类交互

ios - 我很快收到不受支持的参数组合 CGBitmap 错误

ios - self.view.frame.width 在自定义键盘 View Controller 中返回 0

swift - 返回没有 child 的结果的 child 的 Firebase 订单

ios - 是否可以在不使用单例的情况下访问 View Controller 的特定实例?

java - .rsaEncryptionOAEPSHA256算法在iOS上与Java的兼容性

swift - 尝试自定义动画时遵守 UIViewControllerAnimatedTransitioning 协议(protocol)时出错