我跟着一起井字趾快速教程在這裏: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的平等沒有函數調用自己?
如果兩個參數都是零,我打算返回false。現在看來,這似乎是一個糟糕的主意。我會將無效檢查推入使用該代碼的代碼中。謝謝你的幫助。你會認爲這是一個錯誤?似乎應該可以定義一個運算符並在定義中使用該運算符而不遞歸調用它自己的權利? – Gouldsc
我不會稱之爲錯誤。因爲有時我們需要遞歸調用。例如比較一棵樹,除非是葉節點,否則我們需要遞歸調用左子節點和右子節點上的'=='。 –