0

私は次のものを持っています:

protocol Guard {

    var prisoners: Array<Prisoner>? { get set }

    func smack<T: Prisoner>(prisoner: T)

    func smackAll()


}

extension Guard {

    final func smackAll() {

        prisoners?.forEach() { smack($0) }

        //ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'"

    }

}

protocol Prisoner {

    var guards: Array<Guard>? { get set }

}

extension Prisoner {

   final func incurBeating() {

        guards?.forEach() { $0.smack(self) }

    }

}

Guard異なるクラス タイプの任意の数のオブジェクト、および他のオブジェクトにプロトコルを割り当てたいと考えていPrisonerます。ガードとして機能するオブジェクトは、クラス タイプに応じて、独自のスマック実装を持ちます。smackAllしかし、継承する可能性のある各クラスを書き直す理由はありませんGuard。だから私はこのようにしようとしていますが、コンパイラは私を許しません。私は何が欠けていますか?

4

1 に答える 1

0

以下は私のために働くようです。

protocol Guard {
    var prisoners: Array<Prisoner>? { get set }
    func smack<Prisoner>(prisoner: Prisoner)
    func smackAll()
}

extension Guard {
    func smackAll() {
        prisoners?.forEach() { smack($0) }
         //ERROR: "Cannot invoke 'smack' with an argument list of type '(Prisoner)'"
    }
}

protocol Prisoner {
     var guards: Array<Guard>? { get set }
}

注: func smack(prisoner: Prisoner) T: Prisoner を使用する必要はありません。それはすでにインターフェースであり、インターフェースを参照することができます。とにかく、囚人の実装者以外のものをそこに置くことはできません。これを使用する唯一のケースは、T のような具象クラスにさらに制約を追加することです。ここで、MyConcrete は Prisoner を実装します。

于 2015-10-14T23:49:06.293 に答える