web-dev-qa-db-ja.com

特定のクラスのみがプロトコルを採用できることを要求する方法

このプロトコルが必要です:

protocol AddsMoreCommands {
     /* ... */
}

クラスUIViewControllerを継承するクラスでのみ採用されます。 このページ は、次のように記述することで、(構造体ではなく)クラスによってのみ採用されることを指定できることを示しています

protocol AddsMoreCommands: class {
}

しかし、特定のクラスでのみ採用されることを要求する方法はわかりません。 後のページ 適合性をチェックするためにwhere句をプロトコル拡張に追加することについて話しますが、それをどのように適合させるかわかりません。

extension AddsMoreCommands where /* what */ {
}

これを行う方法はありますか?ありがとう!

74
emrys57
protocol AddsMoreCommands: class {
    // Code
}

extension AddsMoreCommands where Self: UIViewController {
    // Code
}
97
Roee84

これは、拡張機能なしでも実現できます。

protocol AddsMoreCommands: class where Self: UIViewController {
   // code
}

編集済み2017/11/04Zig が指摘したように、これはXcode 9.1で警告を生成するようです。現在、Swift project (SR-6265) で報告された問題があります。警告を削除するには、それに注意を払い、それに応じて回答を更新します。

編集済み2018/09/29classは、インスタンスを格納する変数が弱い必要がある場合(デリゲートなど)に必要です)。弱い変数が必要ない場合は、classを省略して次のように記述するだけで、警告は表示されません。

protocol AddsMoreCommands where Self: UIViewController {
   // code
}
66
rgkobashi

前の答えの問題のために、私はこの宣言で終わりました:

protocol AddsMoreCommands where Self : UIViewController { 
    // protocol stuff here  
}

xcode 9.1で警告なし

45
Massmaker

Swift 5では、次の方法でこれを実現できます。

protocol AddsMoreCommands: UIViewController {
     /* ... */
}

とても便利です。

1
Wojciech Kulik