在类中实现委托(iOS / Swift)

时间:2018-05-09 11:29:10

标签: java android ios swift delegates

在移动开发中,接口和委托实现如下(使用位置服务作为示例)

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]) {
        }
    }

这种类型的Android实现的iOS / Swift等价物是什么:

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 :(得分:1)

在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]) { /*...*/ }
}

正如您所看到的,您仍然需要一些实现协议/委托CLLocationManagerDelegate所说的类/结构/枚举,因为(协议)它只是一个蓝图。

(技术说明:协议可以通过协议扩展提供一些实现,但是对于符合类型,您仍然无法实例化协议)。

答案 1 :(得分:0)

如果您想增强位置信息在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()
}

我希望它将对您有帮助