Используйте SOMotionDetector с swift

#objective-c #swift

#objective-c #swift

Вопрос:

Я пытаюсь использовать SOMotionDetector в проекте swift

Есть ли способ перевести этот метод objective c в swift?

 - (void)motionDetector:(SOMotionDetector *)motionDetector locationChanged:(CLLocation *)location
{
    ...
}
 

Комментарии:

1. Преобразование методов делегирования в Swift не совсем то же самое, что и другие методы Obj-C, поскольку важны явные имена параметров. В этом примере вы хотели func motionDetector(motionDetector:SOMotionDetector locationChanged location:CLLocation) бы .

2. Благодаря Silo, он работает отлично

3. Нет проблем, отправил ответ для лучшего объяснения, почему это необходимо.

Ответ №1:

Преобразование методов делегирования из Obj-C в Swift аналогично созданию стандартных функций Swift, с одним дополнительным правилом: явные имена параметров.

В вашем примере это было бы так:

 func motionDetector(motionDetector:SOMotionDetector locationChanged location:CLLocation)
{
    // Do something here...
}
 

Почему у нас это locationChanged перед определением второго аргумента location:CLLocation ?

Это значит, что ваша подпись селектора остается motionDetector:locationChanged: , позволяя вашему имени параметра метода быть location .

Давайте рассмотрим следующий NSURLConnection делегат в Obj-C:

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 

Если мы преобразуем его в Swift без явных имен параметров, вы поймете, почему это неудобно:

 func connection(connection:NSURLConnection didReceiveData:NSData)
{
    self.mutableData.appendData(didReceiveData);  // weird local variable name...
}
 

Теперь мы меняем didReceiveData имя параметра data , но для большей ясности меняем имя локальной переменной на:

 func connection(connection:NSURLConnection didReceiveData data:NSData)
{
    self.mutableData.appendData(data);  // Ahhh.. much better!
}
 

Итак, как вы можете видеть, это очень похоже на стандартные функции Swift, но требует только имен параметров. Обратите внимание, что вы можете сделать это для функций, не связанных с делегированием, если хотите!