如何检查泛型参数关联类型?

时间:2018-02-20 15:11:10

标签: swift generics swift-protocols

为了澄清我的要求,请考虑以下示例:

protocol Food {}
protocol Meat: Food {}

protocol Animal {
    associatedtype Food
    func eat(food: Food)
}

protocol Funny {}

struct Cat: Animal {
    func eat(food: Meat) {
        print("Mewo!")
    }
}

我要做的是将具有特定条件的其他动物与Cat进行比较;假设我们要声明一个比较猫的函数: funny animal (将T与约束进行比较:它必须符合两个协议),方法签名将声明为-in Cat结构 - :

func compareWithFunnyAnimal<T: Animal & Funny>(animal: T) {}

它工作正常,但如果我想将猫与必须吃Meat的动物进行比较(基于T相关类型(Food进行比较)会怎么样?我试着做-in Cat结构 - :

// animal must eat Meat
func compareWithAnimal<T: Animal & T.Food == Meat>(animal: T) {}

但显而易见 - 它不起作用。

对于泛型参数关联类型,如何进行这样的比较?是否需要添加多个通用参数?

1 个答案:

答案 0 :(得分:2)

您应该使用通用where子句来检查T.Food是否为Meat类型。

func compareWithAnimal<T: Animal>(animal: T) where T.Food == Meat {


}

详细了解Generic where Clause