2015-09-11 35 views
4

最近,我對swift中協議的定義方式有些困惑。這些協議定義有什麼區別?

protocol OneDelegate : class

protocol OneDelegate : NSObjectProtocol

@objc protocol OneDelegate

@class_protocol protocol OneDelegate

我們應該繼續使用弱代表?或者像 unowned(unsafe) var dataSource: UITableViewDataSource?

感謝您的幫助!

回答

4

第一個和最後一個實際上是相同的。兩者都指定一個協議只能被一個類採用,即一個結構不能採用該協議。形式protocol OneDelegate : class是優選的。而@class_protocol protocol OneDelegate已棄用。

第二種情況是擴展現有協議的一種方法。比方說你想你的UITableViewDelegate,以響應長按,則你可以定義一個協議:

protocol UITableViewDelegateWithRecognizer: UITableViewDelegate { 
    func longPressed() 
} 

那麼是否符合協議要求UITableViewDelegateWithRecognizer符合所有UITableViewDelegate功能,再加上額外的方法longPressed

如果您打算在用Objective-C編寫的文件中使用協議,則需要使用@objc。此外,如果您想要有可選的功能聲明,則需要使用@objc

最後,內存管理的相同ARC規則適用於Swift Objective-C,因此您通常需要使用weak說明符。需要注意的是,很多Swift對象都是值類型,而不是引用類型。而且你不能對值類型有一個弱引用。因此,如果您需要使用弱引用來避免保留週期,那麼您必須指定該協議是類協議,即您的第一個示例。

+0

不錯的答案+ 1'd – aug2uag

+0

感謝您的回答。這真的很有幫助。 – RayChen