在类中实现委托(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:如何从我的应用程序中实现“兑现”方法?

如何在iOS swift中实现带有月份、日期和时间的自定义选择器?

Google Sign In 调用 App Delegate 中的方法后关闭 View Controller (iOS / Swift)

如何在类中实现 websocket?

TypeScript 在类中实现接口