在类中实现委托(iOS/Swift)
Posted
技术标签:
【中文标题】在类中实现委托(iOS/Swift)【英文标题】:Implementing delegates within the class (iOS/Swift) 【发布时间】:2018-05-09 11:29:09 【问题描述】:在移动开发中,接口和委托的实现如下(以定位服务为例):
1.安卓、Java
public class myClass implements LocationListener
@Override
public void onLocationChanged(Location location)
@Override
public void onStatusChanged(String s, int i, Bundle bundle)
1. ios、斯威夫特
class myVC: UIViewController, CLLocationManagerDelegate
func locationManager(manager: CLLocationManager,
didUpdateLocations locations: [CLLocation])
这种类型的 android 实现的 iOS/Swift 等价物是什么:
2.安卓、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,斯威夫特?
class myVC: UIViewController
???
我没有受过学术训练,所以我的编程术语真的很糟糕。谁能帮助解释这两种实现之间的区别,以及它们的名称?
很多 TIA。
【问题讨论】:
var 委托:CLLocationManagerDelegate?强烈建议在开始之前先阅读 swift 文档developer.apple.com/library/content/documentation/Swift/…LocationListener
这是interface
, CLLocationManagerDelegate
这是Protocol
它们之间有很大的不同。阅读此quora.com/…
不是两种语言的区别。将它们放在类的顶部和在类中实例化它们有什么区别?
【参考方案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
所说的内容,因为(协议)它只是一个蓝图。
(技术说明:协议可以通过协议扩展提供一些实现,但它是为了符合类型,你仍然不能实例化协议)。
【讨论】:
感谢您的解释。【参考方案2】:如果您想增强位置与 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()
希望对你有帮助
【讨论】:
以上是关于在类中实现委托(iOS/Swift)的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS Swift 中实现方法时如何为闭包命名(语法问题)
如何在iOS swift中实现带有月份、日期和时间的自定义选择器?
Google Sign In 调用 App Delegate 中的方法后关闭 View Controller (iOS / Swift)