2016-09-21 21 views
0

這是我在斯威夫特2原來的功能:我想更新我的for循環Swift 3,我無法弄清楚。我不斷收到錯誤

// check on winning combinations 
func checkWinnerMove(){ 
    for var i = 0; i<winningCombinations.count && !isWinner;i += 1 { 
     if gameState[winningCombinations[i][0]-1] == activePlayer && 
      gameState[winningCombinations[i][1]-1] == activePlayer && 
      gameState[winningCombinations[i][2]-1] == activePlayer{ 
       isWinner = true; 

     }else{ 
      isWinner = false; 
     } 
    } 
} 

我已經改成了這樣:

// check on winning combinations 
func checkWinnerMove(){ 

    for i in 0 ..< winningCombinations.count && !isWinner{ 
     if gameState[winningCombinations[i][0]-1] == activePlayer && 
      gameState[winningCombinations[i][1]-1] == activePlayer && 
      gameState[winningCombinations[i][2]-1] == activePlayer{ 
      isWinner = true; 

     }else{ 
      isWinner = false; 
     } 
    } 
} 

但是要得到一個錯誤,當我加入

& &!isWinner

在for-in循環中的聲明。我得到的錯誤是:

沒有「.. <」候選人產生預期的語境結果類型‘布爾’

有什麼建議?謝謝!

+0

@dfri ok謝謝你我會盡力而爲! –

回答

1

不要強行嘗試重寫原來的C風格for循環,請考慮您試圖實現的目標,並嘗試從頭開始以「原生」Swift重新編寫它。一旦你的真實情況得到滿足,如何擺脫你的循環,而不是保持循環簽名?例如。

for i in 1...5 { 
    print(i) 
    if i == 3 { break } 
} // 1 2 3 

適用於您的例子

func checkWinnerMove() 
    isWinner = false 
    for i in 0 ..< winningCombinations.count { 
     if gameState[winningCombinations[i][0]-1] == activePlayer && 
      gameState[winningCombinations[i][1]-1] == activePlayer && 
      gameState[winningCombinations[i][2]-1] == activePlayer { 
      isWinner = true 
      break 
     } 
    } 
} 

顯式的(我們未知)的索引訪問gameStatewinningCombinations序列是相當 「unswifty」 w.r.t.對於索引超出範圍的運行時異常的危險。因此請記住,有更安全的方式來執行此類訪問。


以供將來參考,可以閱讀How to create a Minimal, Complete, and Verifiable example:因爲我們(潛在的回答者你的問題)並不需要/關於isWinnerwinningCombinationsgameStateactivePlayer的完整信息,我們不能驗證訪問你的例子。此外,由於這個問題涵蓋了一個概念,它可以歸結爲一個更簡單的形式。 (歡迎使用StackOverflow!)

+1

好的,謝謝你的信息!我會閱讀這些信息並使用我學到的東西。 –

相關問題