web-dev-qa-db-ja.com

複数の制約を満たすプロトコルを拡張する方法-Swift 2.0

他のプロトコルからの複数の制約を満たすことができるように、プロトコルを拡張しようとしています。正しいようにコードを調整するにはどうすればよいですか?どうもありがとう。

extension Moveable where Self: Animal && Self: Aged {
    public var canMove: Bool { return true }
}

enter image description here

30
Audrey Li

プロトコル構成 を使用できます:

extension Moveable where Self: protocol<Animal, Aged> {
    // ... 
}

または、次々に適合性を追加します。

extension Moveable where Self: Animal, Self: Aged {
    // ... 
}
58
ABakerSmith

この投稿の時点では、答えはprotocol<Animal, Aged>を使用しています。

Swift 3.0では、protocol<Animal, Aged>は廃止されました。

Swift 3.0での正しい使用法は次のとおりです。

extension Moveable where Self: Animal & Aged {
    // ... 
}

プロトコルをtypealiasと組み合わせることもできます。これは、複数の場所でプロトコルの組み合わせを使用している場合に役立ちます(重複を避け、保守性を向上させます)。

typealias AgedAnimal = Aged & Animal
extension Moveable where Self: AgedAnimal {
    // ... 
}
31
kgaidis

Swift 3なので、typealiasを使用して、複数のプロトコルに準拠するタイプを作成できます。

typealias AgedAnimal = Animal & Aged

したがって、コードは次のようになります。

extension Moveable where Self: AgedAnimal {
    // ...
}

またはこのように:

typealias Live = Aged & Moveable

extension Animal where Self: Live {
    // ...
}
1
xcocoader