2017-04-26 125 views
0

说,例如,你在斯威夫特的协议:两种实现Swift授权的方式有什么区别?

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

两个实现它们的方法:

方法1:通过类继承

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

路2 : Via extension

然而,夫特并提供一种可用于实现协议方法

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

是否有关于这两个方法中的任何差的关键字extension

+0

的[是什么协议,扩展和类IOS开发之间的区别可能的复制?以及如何正确使用它们?](http://stackoverflow.com/questions/30859411/what-is-the-difference-between-protocol-extension-and-category-in-ios-developme) – leanne

+0

@leanne我有看过那篇文章。这个问题集中在实施协议的两种方式之间的差异。 – Ben

+0

运行时没有区别。但是,如果你想定义和使用实例变量方式1是唯一的选择。使用方式2如果你想模块化代码,就像把它分解成多个文件一样(对于视图控制器不常用) –

回答

2

每苹果guide

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

因此它看起来在你的情况下,除了你想要如何安排你的代码之外几乎没有什么区别。

1

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

首选:

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 

}

相关问题