如果你是編程新手,這是學習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
返回)。編譯器需要找到這兩種類型的超類型:SKAction
和Void
都是子類型的常見類型。您可以通過改變語句來此明確地看到這一點:
let a = [SKAction.waitForDuration(60),
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addBlock1),
SKAction.runBlock(actualDuration1Reduc),
SKAction.waitForDuration(blockWait1)])))]
編譯器在這裏產生一個稍微有用的(但可能仍無法理解的初學者)的錯誤信息,「‘SKAction’是無法轉換爲‘無效’」 :
那麼,爲什麼你得到的是無用的錯誤訊息呢?好吧,如果你在我的例子a
可變的選項,點擊,你會發現,編譯器已經分配了一個特殊的「錯誤類型」來a
:
回到您的原代碼,這個錯誤類型會過濾語法樹,通過嘗試調用SKAction.sequence
和SKAction.repeatAction
,導致其中每個返回錯誤類型。最後,編譯器回到runAction
的頂級調用。它會嘗試查找將錯誤類型作爲參數的runAction
版本。沒有這樣的版本,所以(顯然是隨機的)它選擇了runAction:completion:
版本。然後它會注意到你沒有通過第二個(completion
)參數來調用runAction
並給你一個錯誤消息,通知你你的失敗。這就是編制者不應該吸毒的原因。
那麼有什麼解決辦法?那麼,我不確定你在代碼中要做什麼,因爲在repeatAction
操作中執行repeatActionForever
操作是沒有意義的。外部(repeatAction
)操作永遠不會有重複的機會,因爲內部(repeatActionForever
)操作永遠不會停止重複。
請把它分成幾部分,爲了上帝的緣故... – Arbitur 2015-03-03 00:23:46