2015-03-02 55 views
0

我想運行一個等待60秒的sksequence,然後啓動一個無限循環,但我不斷收到編譯器錯誤「缺少參數'完成'在調用參數」這是我的代碼:在調用參數'完成'缺少參數

runAction(SKAction.repeatAction((SKAction.sequence(([SKAction.waitForDuration(60), 
     runAction(SKAction.repeatActionForever(
      SKAction.sequence([ 
       SKAction.runBlock(addBlock1), 
       SKAction.runBlock(actualDuration1Reduc), 
       SKAction.waitForDuration(blockWait1),])))]))), count: 1)) 

有人可以幫我嗎?我是編程新手,所以請記住這一點。謝謝

+1

請把它分成幾部分,爲了上帝的緣故... – Arbitur 2015-03-03 00:23:46

回答

1

如果你是編程新手,這是學習Swift的不好時機。正如你所發現的,Swift編譯器經常給出的錯誤消息是完全沒用。現在你可能會更好地學習Objective-C。

這且不說,問題的根源是,你試圖從runAction使用返回值,在這裏:

runAction(SKAction.repeatAction((SKAction.sequence(([SKAction.waitForDuration(60), 
    runAction(SKAction.repeatActionForever(
    ^^^^^^^^^ 
     SKAction.sequence([ 
      SKAction.runBlock(addBlock1), 
      SKAction.runBlock(actualDuration1Reduc), 
      SKAction.waitForDuration(blockWait1),])))]))), count: 1)) 

你試圖在這裏建立了具有兩個元素的數組:一個SKAction(返回通過waitForDuration(60))和Void(由runAction返回)。編譯器需要找到這兩種類型的超類型:SKActionVoid都是子類型的常見類型。您可以通過改變語句來此明確地看到這一點:

let a = [SKAction.waitForDuration(60), 
    runAction(SKAction.repeatActionForever(
     SKAction.sequence([ 
      SKAction.runBlock(addBlock1), 
      SKAction.runBlock(actualDuration1Reduc), 
      SKAction.waitForDuration(blockWait1)])))] 

編譯器在這裏產生一個稍微有用的(但可能仍無法理解的初學者)的錯誤信息,「‘SKAction’是無法轉換爲‘無效’」 :

SKAction is not convertible to Void

那麼,爲什麼你得到的是無用的錯誤訊息呢?好吧,如果你在我的例子a可變的選項,點擊,你會發現,編譯器已經分配了一個特殊的「錯誤類型」來a

error type

回到您的原代碼,這個錯誤類型會過濾語法樹,通過嘗試調用SKAction.sequenceSKAction.repeatAction,導致其中每個返回錯誤類型。最後,編譯器回到runAction的頂級調用。它會嘗試查找將錯誤類型作爲參數的runAction版本。沒有這樣的版本,所以(顯然是隨機的)它選擇了runAction:completion:版本。然後它會注意到你沒有通過第二個(completion)參數來調用runAction並給你一個錯誤消息,通知你你的失敗。這就是編制者不應該吸毒的原因。

那麼有什麼解決辦法?那麼,我不確定你在代碼中要做什麼,因爲在repeatAction操作中執行repeatActionForever操作是沒有意義的。外部(repeatAction)操作永遠不會有重複的機會,因爲內部(repeatActionForever)操作永遠不會停止重複。