2014-07-16 96 views
0

我跟着一起井字趾快速教程在這裏:https://www.youtube.com/watch?v=LkYpoRj-7hA使用Swift運算符定義避免無限遞歸?

我一直在對代碼進行更改,例如創建結構和枚舉以更好地構造代碼中的實體。我想創建一個名爲「Player」的兩個可選Structs的等號操作符。如果任何一個參數爲零或它們的「種類」字段不相等(該種類是一個枚舉),此運算符將返回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. } 

的問題是,我相信它被遞歸調用自身,當我檢查零(5號線)。它在運行時崩潰,調用堆棧一遍又一遍地列出了這個函數。

問題:我的假設是否觸發無限遞歸是正確的?如果是這樣的話,這是Swift中的一個錯誤還是它應該如何工作?有沒有一種方法來檢查與nil的平等沒有函數調用自己?

回答

1

您可以使用開關

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

而且,您的實現返回false崩潰,如果兩個leftrightnil

修正版本

@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?是EQU atable

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

如果兩個參數都是零,我打算返回false。現在看來,這似乎是一個糟糕的主意。我會將無效檢查推入使用該代碼的代碼中。謝謝你的幫助。你會認爲這是一個錯誤?似乎應該可以定義一個運算符並在定義中使用該運算符而不遞歸調用它自己的權利? – Gouldsc

+0

我不會稱之爲錯誤。因爲有時我們需要遞歸調用。例如比較一棵樹,除非是葉節點,否則我們需要遞歸調用左子節點和右子節點上的'=='。 –

1

@Gouldsc我曾與另一段代碼用於零檢查了類似的問題,@BryanChen絕對有聲明nils爲布爾值,然後將通過if說法正確的想法。

我正在脫離Skip的教程,以及我想知道在設備上測試應用程序時是否有任何AI Turn問題?或者有其他方式來編寫應用程序的AI Turn部分?

+0

我注意到他的AI代碼中至少有一個邏輯錯誤。我正在重構它(試圖在Swift中使用不同的功能)來更好地學習語言。如果我設法完成它,我會在這裏發佈鏈接。 – Gouldsc

+0

@Gouldsc好吧,好主意。如果您最終發佈重構版本,如果您在帖子中標記我,我將不勝感激。 – skyguy