Вам не хватает метки аргумента, как в определении метода, так и в вызове метода.
Прежде всего, я вижу, откуда вы: в большинстве языков программирования, включая, помимо прочего, C, C ++, Java и т. Д., Метод имеет вид:
float acceleration(float speed, float angle) { }
Objective-C, однако, отличается, потому что вам также нужно пометить аргументы:
- (float) accelerationFromSpeed:(float)speed andAngle:(float)angle { }
Теперь новички в objC могут спросить, зачем нам маркировать аргументы, когда мы их уже называем? Рассмотрим следующий C ++-вызов нашего первого метода выше:
float result = obj->acceleration(23, 45);
Теперь позвольте мне спросить вас, на что ссылаются 23 и 45? Вы должны были бы вернуться к определению метода, чтобы знать, что, например, 23 - это скорость, а 45 - угол. Некоторые программисты могут даже делать следующее:
float speed = 23;
float angle = 45;
float result = obj->acceleration(speed, angle);
Тем не менее, зачем нам объявлять переменные, когда мы можем сделать следующее в Objective-C:
float result = [obj accelerationFromSpeed:23 andAngle:45];
Теперь вы можете легко узнать, что означают 23 и 45, просто из самого вызова метода. Нет необходимости возвращаться или запоминать заголовок определения метода или объявлять переменные.
Возвращаясь к вашему коду, вам нужно изменить заголовок определения вашего метода на что-то вроде:
-(void) translate:(CGPoint)translateLocation
withVelocity:(float)objectVelocity
andObjectLocation:(CGPoint)objectLocation
andSender:(DefaultObject *)sender
{
CGPoint moveDifference = ccpSub(translateLocation, objectLocation);
float distanceToMove = ccpLength(moveDifference);
float moveDuration = distanceToMove / objectVelocity;
[sender runAction:[CCMoveTo actionWithDuration:moveDuration position:translateLocation]];
}
И назовите его используя (для ясности сделано многострочным, но вы всегда можете свернуть его в одну строку, если хотите):
[pc
translate:touchLocation
withVelocity:300.0
andObjectLocation:pc.position
andSender:pc];