2016-07-28 6 views
1

Ich arbeite mit Swift und SpriteKiteine Funktion aufrufen, die Argumente mit SKAction.runBlock erwartet()

Ich mag würde SKAction.runBlock() verwenden, um eine Funktion auszuführen, die Argumente erwarten:

class Tile : SKShapeNode 
{ 
} 

override func didMoveToView() 
{ 
    let tile = Tile() 
    tile.runAction(SKAction.runBlock(myFunc(tile))) 
} 

func myFunc(tile: Tile) 
{ 
} 

Wenn ich versuche, eine Funktion zu erstellen, die kein Argument nicht erwarten, alles funktioniert gut, aber der Code oben gibt diese:

Wert kann nicht vom Typ konvertieren ‚()‘ zu erwarteten Argumenttyp ' Versand _block_t '(alias' @convention (block)() ->() ')

Was verstehe ich nicht?

Antwort

3

Mit dieser Art von Ausdruck schreiben:

SKAction.runBlock(myFunc(tile)) 

Sie passieren das Ergebnis myFunc(tile) des Aufrufs.

(ich glaube, Sie dieser Code nicht denken. SKAction.runBlock(sin(0)), würde eine Art Schließung runBlock Pass)

und der Rückgabewert von myFunc(tile) ist ein Leerwert, als myFunc deklariert wird nichts zurück. Ein ungültiger Wert kann auch als () dargestellt werden. Die Fehlermeldung () kann nicht in eine Schließung vom Typ @convention(block)() ->() konvertiert werden.

Daher müssen Sie eine Schließung des Typs @convention(block)() ->() erstellen.

tile.runAction(SKAction.runBlock({()->() in myFunc(tile)})) 

kurz:

tile.runAction(SKAction.runBlock({myFunc(tile)})) 
+0

Vielen Dank für diese klare Erklärung. Warum kann ich eine Funktion ohne erwartetes Argument aufrufen, ohne "{}" eingeben zu müssen? – Drakalex

+1

@Drakalex, in Swift werden Methodenverweise automatisch in einen Abschluss mit demselben Funktionstyp konvertiert. Wenn Sie also 'myFunc' schreiben, erstellen Sie eine Schließung vom Typ' (Tile) -> Void'. Also, wenn 'anotherFunc' als' func anotherFunc() {} 'deklariert wird, erzeugt das Schreiben von' anotherFunc' eine Schließung vom Typ '() -> Void' (wie' ') ->()'), was Sie auch tun können habe schon gesehen. – OOPer

+0

Funktionen sind Schließungen, es ist ein Sonderfall Schließung, so dass keine Konvertierung passiert. (Ignorieren letzten Kommentar, ich verstehe, was Sie jetzt sagen) – Knight0fDragon

1

Sie vermissen {} Nur:

tile.runAction(SKAction.runBlock({ 
    myFunc(tile)})) 
Verwandte Themen