【问题标题】:Two ways of implement Delegation in Swift, what is the difference?在 Swift 中实现委托的两种方式,有什么区别?
【发布时间】:2017-09-24 13:39:40
【问题描述】:

假设你在 Swift 中有一个协议:

protocol WeatherServiceDelegate: class {   
    func didCompleteRequest(result: String)
}

两种实现方式:

方式一:通过类继承

class ViewController: UIViewController, WeatherServiceDelegate {
     ....
}

方式2:通过扩展

不过,Swift 确实提供了一个关键字extension,可以用来实现协议方法

extension ViewController: WeatherServiceDelegate{
    func didCompleteRequest(result: String){
        print(result)
    }
}

这两种方法有什么区别吗?

【问题讨论】:

标签: swift protocols delegation


【解决方案1】:

根据 Apple 的guide

扩展为现有的类、结构、枚举或协议类型添加新功能。这包括扩展您无法访问其原始源代码的类型的能力(称为追溯建模)。

因此,在您的情况下,除了您希望如何安排代码之外,几乎没有什么区别。

【讨论】:

    【解决方案2】:

    好吧!运行时没有区别。但是当向模型添加协议一致性时,更喜欢为协议方法添加单独的扩展。这将相关方法与协议组合在一起,并且可以简化将协议添加到类及其相关方法的说明。

    首选:

        class MyViewController: UIViewController {
        // class stuff here
    }
    
    // MARK: - UITableViewDataSource
    extension MyViewController: UITableViewDataSource {
        // table view data source methods
    }
    
    // MARK: - UIScrollViewDelegate
    extension MyViewController: UIScrollViewDelegate {
        // scroll view delegate methods
    }
    

    不喜欢:

    class MyViewController:UIViewController,UITableViewDataSource,UIScrollViewDelegate {
    // all methods
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多