2016-10-17 48 views
3

這個SO post很好地解釋瞭如何解決創建delegate的問題,即weak在協議聲明中,`:class`做了什麼?

從本質上講,有2種方法:

使用@objc關鍵字:

@objc protocol MyClassDelegate { 
} 

class MyClass { 
    weak var delegate: MyClassDelegate? 
} 

使用:class關鍵字:

protocol MyClassDelegate: class { 
} 

class MyClass { 
    weak var delegate: MyClassDelegate? 
} 

我試圖做一些研究瞭解究竟有什麼區別這兩種方法之間的關係是。該docs是關於使用@objc很清楚:

要在Objective-C的訪問和使用,迅捷的類必須是一個Objective-C類的子類或必須註明@objc

但是,無處我找到了一些關於:class究竟做什麼的信息。仔細考慮整個概念,實際上並沒有多大意義。我的理解是,class是Swift中的一個關鍵字,用於聲明類。所以,在這裏,我們似乎使用關鍵字class本身作爲協議(因爲我們在協議聲明後將其附加在:之後)。

那麼,爲什麼它甚至在語法上起作用,它究竟做了什麼?

+1

相關:[Swift:如何解決類型'協議'的弱變量是非法的問題](http://stackoverflow.com/questions/37132190/swift-how-to-work-around-issue-where - 弱變量類型協議是非法的) – Hamish

+2

也有關:[swift協議'弱'不能應用於非類類型](http://stackoverflow.com/q/33471858/2976878) – Hamish

+1

也許在這種情況下也是有趣的:[從AnyObject擴展的協議和類專用協議有什麼區別?](http://stackoverflow.com/questions/30176814/whats-the-difference-between-a-protocol-從anybject和a-class-onl擴展)(和答案*似乎*爲「無」)。 –

回答

5

:class確保只有類可以實現協議。這是任何類,不只是NSObject的子類。另一方面,@objc告訴編譯器使用Objective-C風格的消息傳遞來調用方法,而不是使用vtable來查找函數。

+0

非常感謝您的回答!你有任何(官方)資源解釋爲什麼我們可以在協議聲明中使用':class'?語法對我來說似乎很奇怪,真的很想閱讀更多關於此的內容。 – nburk

+0

你的意思只是[蘋果的Swift文檔](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID281 )? – NRitH

+0

哦,是的,這幾乎是我所期待的,謝謝! – nburk

相關問題