2016-12-27 36 views
1

我想創建一個協議,只有從UIView繼承的類可以符合。擴展只能應用於給定的類類型

有沒有辦法做到這一點?

I.E.

protocol MyProtocol { 
    fun someMethod() 
} 

是我的協議

class MyView: UIView, MyProtocol { 
    func someMethod() { } 
} 

會工作得很好

class MyObject: NSObject { 
    func someMethod() 
} 

不會編譯。

+2

你爲什麼要這樣做?如果一個類型可以滿足'MyProtocol'的要求,爲什麼不能讓它符合? – Hamish

回答

2

兩個選項:

  1. 創建附加議定書UIViewType,使UIView符合該協議和約束MyProtocolUIViewType

    protocol UIViewType {} 
    
    extension UIView : UIViewType {} 
    
    protocol MyProtocol : UIViewType {} 
    
  2. 使用協議擴展:

    protocol MyProtocol {} 
    
    extension MyProtocol where Self : UIView {} 
    
+0

請注意,除非這些選項是'UIView',否則這兩個選項都不能阻止*類型符合'MyProtocol'。有了第一個選項,類型也可以符合「UIViewType」。使用第二種選擇,我無法看到它將如何工作 - 協議擴展不會限制協議的一致性,它們只是讓您添加默認實現。 – Hamish