Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中实现委托的两种方式有什么区别?_Swift_Protocols_Delegation - Fatal编程技术网

Swift中实现委托的两种方式有什么区别?

Swift中实现委托的两种方式有什么区别?,swift,protocols,delegation,Swift,Protocols,Delegation,例如,假设您在Swift中有一个协议: protocol WeatherServiceDelegate: class { func didCompleteRequest(result: String) } 两种实施方法: 方式1:通过类继承 class ViewController: UIViewController, WeatherServiceDelegate { .... } 方式2:通过分机 但是,Swift确实提供了一个关键字扩展,可用于实现协议方法 ex

例如,假设您在Swift中有一个协议:

protocol WeatherServiceDelegate: class {   
    func didCompleteRequest(result: String)
}
两种实施方法:

方式1:通过类继承

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

方式2:通过分机

但是,Swift确实提供了一个关键字
扩展
,可用于实现协议方法

extension ViewController: WeatherServiceDelegate{
    func didCompleteRequest(result: String){
        print(result)
    }
}
这两种方法有什么区别吗

每个苹果的:

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


因此,在您的情况下,除了您希望如何安排代码外,似乎没有什么不同。

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

首选:

    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
非首选:

    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

}

可能重复@leanne的文章我已经看过了。这个问题的重点是实现协议的两种方法之间的区别。在运行时没有区别。但是,如果您想定义和使用实例变量,那么Way 1是您唯一的选择。使用方式2如果您想要模块化代码,比如将代码分解成多个文件(对于视图控制器来说并不常见)。更一般地说,它不是“实现委派的两种方式”,而是“实现协议采用的两种方式”。