Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 使用Swift运算符定义避免无限递归?_Recursion_Swift_Operator Overloading_Infinite Loop - Fatal编程技术网

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

Recursion 使用Swift运算符定义避免无限递归?,recursion,swift,operator-overloading,infinite-loop,Recursion,Swift,Operator Overloading,Infinite Loop,下面是一个Tic Tac Toe swift教程: 我一直在对代码进行更改,例如创建结构和枚举,以更好地构造代码中的实体。我想为两个名为“Player”的可选结构创建一个相等运算符。如果任一参数为nil或它们的“种类”字段不相等(种类是枚举),则该运算符将返回false。以下是我为此编写的代码: 1. @infix func == ( left: Player?, right: Player? ) -> Bool 2. { 3. var isEqual = false 4. 5

下面是一个Tic Tac Toe swift教程:

我一直在对代码进行更改,例如创建结构和枚举,以更好地构造代码中的实体。我想为两个名为“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中的一个bug还是它应该这样工作?有没有一种方法可以在不调用函数本身的情况下检查与nil的相等性?

您可以使用switch

switch left {
    case .None: return false
    default: break
}
另外,如果
left
right
都是
nil

固定版本

@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
}
如果
种类?
是相等的

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

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


我正在学习Skip的教程,我想知道在设备上测试应用程序时,您是否对AI转向有任何问题?或者对编写应用程序AI Turn部分的其他方法有什么见解?

如果两个参数都为零,我打算返回false。现在我想起来,这似乎是个坏主意。我将把nil检查推到使用它的代码中。谢谢你的帮助。你认为这是错误吗?似乎应该可以定义一个运算符,并在定义中使用该运算符,而无需递归地调用自己,对吗?我不会将其称为bug。因为有时候我们需要递归调用。e、 比较一棵树,我们希望递归调用左子和右子的
=
,除非它是叶节点。我注意到他的AI代码中至少有一个逻辑错误。我正在对它进行重构(尝试在Swift中使用不同的功能),以便更好地学习该语言。如果我能完成的话,我会在这里发布一个链接。@Gouldsc好的,好主意。如果你最终发布了重构版本,如果你能在帖子中给我贴上标签,我将不胜感激。