Swift协议扩展-无法访问功能

时间:2018-07-08 22:18:05

标签: swift protocols

如果我有一系列这样的协议:

given =

和扩展名如下:

    protocol Customer {

    var name:String { get set }
    var age: Int { get set }
    var startDate:Date { get set }
    var meals:Array<String> { get set }
    var market:Int { get set }

}

protocol Vegan:Customer {

}

protocol Vegetarian:Customer {

}

protocol Paleo:Customer {


}

和这个结构

    extension Customer where Self:Vegan, Self:Vegetarian {

    func getMeals() -> Array<String> {
        return ["VeganMeal1", "VeganMeal2", "VeganMeal3", "VeganMeal4"]
    }
}

extension Customer where Self:Vegetarian {

    func getMeals() -> Array<String> {
        return ["VegetarianMeal1", "VegetarianMeal2", "VegetarianMeal3", "VegetarianMeal4"]
    }
}

extension Customer where Self:Paleo {

    func getMeals() -> Array<String> {
        return ["PaleoMeal1", "PaleoMeal2", "PaleoMeal3", "PaleoMeal4"]
    }
}

当我基于该结构创建新对象时

    struct aCustomer:Customer, Vegan {

    var name:String
    var age: Int
    var startDate:Date
    var meals:Array<String>
    var market:Int

}

为什么我不能访问扩展中的getMeals函数?我收到一条错误消息,指出getMeals是一个含糊的参考。

enter image description here

1 个答案:

答案 0 :(得分:1)

extension Customer where Self:Vegan, Self:Vegetarian {
如果采用者或客户同时采用素食主义者和素食主义者,则

扩展客户。您的aCustomer(以小写字母开头的结构类型-恐怖,即恐怖)不会这样做,因此扩展名不适用于它。

如果目标是在采用者采用素食主义者时注入相同的代码 或在采用者采用素食主义者时注入,则使用两个扩展名,或者如果您不采用像重复一样,让它们都采用某种“更高”的协议,并用要注入的所需代码扩展。