2016-07-28 5 views
1

Я работаю с Swift и SpriteKitВызов функции, которая ожидает аргументы SKAction.runBlock()

Я хотел бы использовать SKAction.runBlock(), чтобы запустить функцию, ожидать аргументы:

class Tile : SKShapeNode 
{ 
} 

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

func myFunc(tile: Tile) 
{ 
} 

Когда я пытаюсь создать функцию, которая не ожидает каких-либо аргументов, все работает отлично, но выше код возвращает это:

Невозможно преобразовать значение типа «()» с ожидаемым типом аргумента ' отправка _block_t '(aka' @convention (block)() ->() ')

Что я не понимаю?

ответ

3

С написания такого рода выражение:

SKAction.runBlock(myFunc(tile)) 

Вы передаете результат вызова myFunc(tile).

(я полагаю, вы не думаете, этот код:. SKAction.runBlock(sin(0)), пройдет какое-то закрытие в runBlock)

И возвращаемое значение из myFunc(tile) является значение недействительным, поскольку myFunc объявляется не возвращать ничего. Значение пустот может быть представлено также как (). Сообщение об ошибке говорит, что () не может быть преобразован в замыкание типа @convention(block)() ->().

Таким образом, вам необходимо создать замыкание типа @convention(block)() ->().

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

короче:

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

Спасибо за этого ясного объяснения. Итак, почему я могу вызвать функцию без ожидаемого аргумента без необходимости «{}"? – Drakalex

+1

@Drakalex, в Swift, ссылки на методы автоматически преобразуются в замыкание с тем же типом функции. Итак, просто написав 'myFunc', вы создаете закрытие типа' (Tile) -> Void'. Итак, если 'anotherFunc' объявлен как' func anotherFunc() {} ', запись' anotherFunc' создает закрытие типа '() -> Void' (то же самое, что'() ->() '), что вы можете видели раньше. – OOPer

+0

Функции - это закрытие, это закрытие специального случая, поэтому никакого преобразования не происходит (игнорируйте последний комментарий, я понимаю, что вы сейчас говорите) – Knight0fDragon

1

У вас не хватает {} Просто:

tile.runAction(SKAction.runBlock({ 
    myFunc(tile)})) 
Смежные вопросы