recursion - 使用 Swift 运算符定义避免无限递归?

标签 recursion swift operator-overloading infinite-loop

我在这里跟随井字游戏快速教程:https://www.youtube.com/watch?v=LkYpoRj-7hA .

随着我的进步,我一直在对代码进行更改,例如创建结构和枚举以更好地构建代码中的实体。我想为两个名为“Player”的可选结构创建相等运算符。如果任一参数为 nil 或者它们的“种类”字段不相等(种类是枚举),此运算符将返回 false。这是我为此编写的代码:

1.  @infix func == ( left: Player?, right: Player? ) -> Bool
2.  {
3.     var isEqual = false
4.
5.     if( left? == nil || right? == nil )
6.     {
7.         isEqual = false
8.     }
9.
10.    if( left!.kind == right!.kind )
11.    {
12.         isEqual = true
13.    }
14.
15.    return isEqual
16. }

问题是当我检查 nil(第 5 行)时,我相信它会被递归调用。它在运行时崩溃,调用堆栈一遍又一遍地列出此函数。

问题:我关于这会触发无限递归的假设是否正确?如果是这样,这是 Swift 中的错误还是它应该如何工作?有没有办法在函数不调用自身的情况下检查与 nil 是否相等?

最佳答案

你可以使用开关

switch left {
    case .None: return false
    default: break
}

此外,如果 both left,您的实现返回 false 会崩溃或 rightnil

固定版本

@infix func == ( left: Player?, right: Player? ) -> Bool
{
    var leftIsNil = false

    switch left {
        case .None: leftIsNil = true
        default: break
    }

    var rightIsNil = false

    switch right {
        case .None: rightIsNil = true
        default: break
    }

    if leftIsNil || rightIsNil {
        return leftIsNil == rightIsNil // return true if both nil
    } 

    return left!.kind == right!.kind // return true if both same kind
}

如果Kind?是平等的

@infix func == ( left: Player?, right: Player? ) -> Bool
{
    return left?.kind == right?.kind
}

关于recursion - 使用 Swift 运算符定义避免无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791477/

相关文章:

c++ - 如何在 C++ 中重载 << 运算符以重复使用?

python - 这个嵌套递归怎么理解呢?

recursion - Clojure - 递归展平嵌套 map

ios - 无法将数据加载到自定义 Collection View 中

swift - 如何在 swift3 中播放和停止 AVAudioPlayer?

使用 CAShapeLayer() 和 UIBezierPath 快速绘制和调整圆

python-3.x - 在 Python 中编写递归函数

java - 递归中的局部变量保留值?

c++ - 重载强制转换以使类的行为与指针相同时的正确行为

c++ - 我的 operator<< 重载代码有什么问题?