iOS/Swift类内Delegate等价实现及两种实现差异解析
嗨,我来帮你理清楚这个问题~先给你要的Swift等价写法,再用直白的话解释两种实现方式的差异和名称,尽量避开晦涩术语😉
移动开发中定位服务的接口/委托实现对比
一、你要的iOS(Swift)等价写法
对应你给出的Android匿名内部类实现,Swift里可以这么写(因为Swift没有直接的匿名内部类语法,我们用匿名的NSObject子类来实现协议,这是最贴近Java写法的等价方式):
class myVC: UIViewController { // 创建一个匿名的CLLocationManagerDelegate实现实例 let gpsDelegate: CLLocationManagerDelegate = class: NSObject, CLLocationManagerDelegate { // 对应Java的onLocationChanged方法 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { // 这里写位置更新后的处理逻辑 } // 对应Java的onStatusChanged方法(Swift里授权状态变化用这个方法) func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { // 这里写状态变化后的处理逻辑 } }() }
注:Swift中如果要实现Objective-C系的协议(比如CLLocationManagerDelegate),通常需要继承NSObject,所以我们用
class: NSObject, CLLocationManagerDelegate来创建匿名类。
二、两种实现方式的差异及名称
我用大白话给你区分这两种写法:
1. 第一种:类直接实现接口/遵守协议
- Java(Android)名称:类实现接口(Class Implements Interface)
- 写法是让
myClass直接去实现LocationListener接口,意味着这个类本身必须实现接口要求的所有方法(比如onLocationChanged、onStatusChanged)。整个类的实例都可以作为LocationListener的实例来使用。
- 写法是让
- Swift(iOS)名称:类遵守协议(Class Conforms to Protocol)
- 写法是让
myVC直接遵守CLLocationManagerDelegate协议,同样这个类必须实现协议要求的方法,类的实例本身就可以作为委托对象传给CLLocationManager。
- 写法是让
特点:这种方式适合当这个类本身就是定位服务的主要处理者,逻辑和类本身强关联的场景。
2. 第二种:内部匿名实现
- Java(Android)名称:匿名内部类实现接口(Anonymous Inner Class)
- 你写的代码是在
myClass内部,创建了一个没有名字的“小类”,这个小类实现了LocationListener接口,然后直接实例化作为myClass的成员变量GPS。这个匿名类只属于当前myClass的实例,不需要单独定义一个新的类文件。
- 你写的代码是在
- Swift(iOS)对应方式名称:匿名协议实现类(Anonymous Protocol-Conforming Class)
- 因为Swift没有直接的匿名内部类语法,所以我们用匿名的NSObject子类来实现
CLLocationManagerDelegate协议,同样这个匿名类的作用域只在myVC内部,不需要单独定义类。
- 因为Swift没有直接的匿名内部类语法,所以我们用匿名的NSObject子类来实现
特点:这种方式适合当定位逻辑只是类的一部分,不想让整个类都绑定到定位接口/协议上,或者需要多个不同逻辑的委托实例的场景。
内容的提问来源于stack exchange,提问作者iSofia
相关产品推荐
相关产品推荐

