#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, но требует только имен параметров. Обратите внимание, что вы можете сделать это для функций, не связанных с делегированием, если хотите!