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

时间:2014-07-16 21:54:49

标签: recursion swift operator-overloading infinite-loop

我在这里跟随Tic Tac Toe swift教程:https://www.youtube.com/watch?v=LkYpoRj-7hA

我一直在对代码进行更改,例如创建结构和枚举以更好地构造代码中的实体。我想为两个名为“Player”的可选Structs创建一个相等运算符。如果任一参数为nil或者它们的“kind”字段不相等(种类是枚举),则此运算符将返回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是否相等?

2 个答案:

答案 0 :(得分:1)

您可以使用开关

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

此外,如果 leftrightnil

,您的实现将返回false 崩溃

修正版

@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
}

答案 1 :(得分:1)

@Gouldsc我在另一段代码中检查nil时遇到了类似的问题,@ BryanChen肯定有正确的想法将nils声明为布尔值,然后通过if语句。

我正在使用Skip的教程以及我在想在设备上测试应用程序时是否遇到任何问题?或者对编写应用程序的AI Turn部分的其他方法有任何见解?