2017-02-08 6 views
0

上の制約を作成する方法私はUIViewから継承したクラスで実装することができ、プロトコルを作成しようとしました、私の驚きだったものを、このコードは(スウィフト3.0に)エラーなしでコンパイルする場合:プロトコル

protocol TestsProtocol { 
    func test() 
} 

extension TestsProtocol where Self: UIView { } 

class FooClass: TestsProtocol { 

    func test() { 

    } 
} 

我々 FooClassUIViewから継承していないことがわかります。プロトコル拡張を使用すると、UIViewを継承するクラスだけがそれを実装できるように強制することはありません。 私が知っている限り、これはSwift 2.1でコンパイルされませんでした。

+0

Swift 2.1でこれがコンパイルされない理由を考えることはできません。プロトコル拡張はプロトコルに準拠できるタイプを制限しておらず、デフォルトの実装を追加するだけです。しかし実際の問題は、あるタイプのプロトコルがすべての要件を満たすことができるかどうかです。なぜなら、それがUIViewでもなければ、適合させるべきではないのはなぜですか? – Hamish

+0

[指定されたクラスタイプに対してのみ適用可能な[extension]の重複の可能性があります](http://stackoverflow.com/questions/41349324/extension-that-c​​an-only-be-applied-on-a-given-class-タイプ) - 私はそこでの答えがあなたが望むものを正確に達成するとは信じていませんが。答えは、準拠タイプに基づいてプロトコルへの適合を制限することはできません。 – Hamish

答えて

2

これはSwiftでは実行できません。

extension TestsProtocol where Self: UIView { 
    func useful() { 
     // do something useful 
    } 
} 

今TestsProtocolを実装し、UIViewの(またはサブクラス)である任意のクラスにも便利()関数があります:拡張構文は、他の何かを行います。