我在这里跟随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是否相等?
答案 0 :(得分:1)
您可以使用开关
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
}
如果Kind?
是等同的
@infix func == ( left: Player?, right: Player? ) -> Bool
{
return left?.kind == right?.kind
}
答案 1 :(得分:1)
@Gouldsc我在另一段代码中检查nil时遇到了类似的问题,@ BryanChen肯定有正确的想法将nils
声明为布尔值,然后通过if
语句。
我正在使用Skip的教程以及我在想在设备上测试应用程序时是否遇到任何问题?或者对编写应用程序的AI Turn部分的其他方法有任何见解?