Реализация делегатов внутри класса (iOS / Swift) - PullRequest
0 голосов
/ 09 мая 2018

В разработке для мобильных устройств интерфейсы и делегаты реализованы следующим образом (на примере используется служба определения местоположения) :

1. Android, Java

    public class myClass implements LocationListener {      
        @Override
        public void onLocationChanged(Location location) {          
        }
        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
        }   
    }

1. iOS, Swift

    class myVC: UIViewController, CLLocationManagerDelegate {
        func locationManager(manager: CLLocationManager, 
                             didUpdateLocations locations: [CLLocation]) {
        }
    }

Что будет эквивалентно iOS / Swift для реализации этого типа Android:

2. Android, Java

    public class myClass {      
        LocationListener GPS = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {          
            }
            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {
            }               
        }
    }   

2. iOS, Swift?

    class myVC: UIViewController {
       ???
    }

Я не обучен академически, поэтому мой язык программирования действительно плох. Может ли кто-нибудь также помочь объяснить различия между этими двумя типами реализаций и как они называются?

Много TIA.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Если вы хотите улучшить работу локации с IOS, вы можете сделать это следующим образом:

Добавить эти строки в Info.plist

<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

Шаг: 1

Declare the delegate in class where you need location update
Let say 

class LocationPickerViewController: CLLocationManagerDelegate 

1.1 - Объявить объект locationManager

let locationManager = CLLocationManager()

Шаг: 2

Define one method where you configure all this for Location method
let say

func setupLocationAcess()
{
   locationManager = CLLocationManager()
   locationManager.delegate = self
   locationManager.requestWhenInUseAuthorization()
   locationManager.desiredAccuracy = kCLLocationAccuracyBest
   locationManager.startUpdatingLocation()
}

Шаг: 3 Определите этот метод для viewWillAppear

Шаг: 4 Реализуйте метод делегата в вашем классе

public func locationManager(_ manager: CLLocationManager, didUpdateLocations 
locations: [CLLocation]) 
{
    guard let location = locations.first else { return }
    currentLocationListeners.forEach { $0.action(location) }
    currentLocationListeners = currentLocationListeners.filter { !$0.once }
    manager.stopUpdatingLocation()
}

Надеюсь, это поможет вам

0 голосов
/ 09 мая 2018

В Swift протокол, такой как CLLocationManagerDelegate, предоставляет план «материала», который должен реализовать класс, структура или перечисление, чтобы сказать, что он «соответствует» этому конкретному протоколу. (Также могут быть необязательные методы, которые не обязательно должны быть реализованы.)

В вашем первом примере:

class myVC: UIViewController, CLLocationManagerDelegate { }

myVC говорит, что он реализует / соответствует протоколу CLLocationManagerDelegate. Для этого он должен реализовать все необходимые методы этого протокола и может также реализовать любые необязательные ; такие как locationManager(_:didUpdateLocations:).

Если я понимаю ваш вопрос, вы хотели бы знать, можете ли вы в итоге реализовать myClass, не сказав, что он реализует CLLocationManagerDelegate. Примерно так:

class myVC: UIViewController {
   var locationManagerDelegate = SomethingImplementingTheDelegate()
}

class SomethingImplementingTheDelegate: CLLocationManagerDelegate {
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { /*...*/ }
}

Как видите, вам все еще нужен некоторый класс / struct / enum, который реализует то, что говорит протокол / делегат CLLocationManagerDelegate, так как (протокол) это просто проект.

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

...