2017-04-26 40 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 

}

相關問題