如果我有一系列这样的协议:
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是一个含糊的参考。
答案 0 :(得分:1)
extension Customer where Self:Vegan, Self:Vegetarian {
如果采用者或客户同时采用素食主义者和素食主义者,则扩展客户。您的aCustomer
(以小写字母开头的结构类型-恐怖,即恐怖)不会这样做,因此扩展名不适用于它。
如果目标是在采用者采用素食主义者时注入相同的代码 或在采用者采用素食主义者时注入,则使用两个扩展名,或者如果您不采用像重复一样,让它们都采用某种“更高”的协议,并用要注入的所需代码扩展。