Recursion 使用Swift运算符定义避免无限递归?
下面是一个Tic Tac Toe swift教程: 我一直在对代码进行更改,例如创建结构和枚举,以更好地构造代码中的实体。我想为两个名为“Player”的可选结构创建一个相等运算符。如果任一参数为nil或它们的“种类”字段不相等(种类是枚举),则该运算符将返回false。以下是我为此编写的代码: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
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好的,好主意。如果你最终发布了重构版本,如果你能在帖子中给我贴上标签,我将不胜感激。