在移动开发中,接口和委托实现如下(使用位置服务作为示例):
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。
答案 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()
}
我希望它将对您有帮助