【问题标题】:Avoid Infinite recursion with Swift Operator Definitions?使用 Swift 运算符定义避免无限递归?
【发布时间】:2014-07-16 21:54:48
【问题描述】:

我在这里跟随一个井字游戏快速教程: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 的相等性?

【问题讨论】:

    标签: recursion swift operator-overloading infinite-loop


    【解决方案1】:

    你可以使用开关

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

    此外,如果 both leftright 都是 nil

    ,您的实现 return 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
    }
    

    【讨论】:

    • 如果两个参数都为零,我打算返回 false。现在想想,这似乎是个坏主意。我会将 nil 检查推送到使用它的代码中。谢谢你的帮助。你会认为这是一个错误吗?似乎应该可以定义一个运算符并在定义中使用该运算符而无需递归调用自身对吗?
    • 我不会称之为错误。因为有时我们确实想要递归调用。例如比较一棵树,我们希望在左孩子和右孩子上递归调用==,除非它是叶子节点。
    【解决方案2】:

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

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

    【讨论】:

    • 我注意到他的 AI 代码中至少有一个逻辑错误。我正在努力重构它(尝试在 Swift 中使用不同的特性)以更好地学习这门语言。如果我能完成它,我会在这里发布一个链接。
    • @Gouldsc 好的,好主意。如果您最终发布重构版本,如果您在帖子中标记我,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2020-11-10
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多