如果我有一系列这样的协议(protocol):
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
}
当我基于该结构创建一个新对象时
var newCustomer = aCustomer(name:"William", age:40, startDate:Date(), meals:[], market:1)
为什么我无法访问扩展中的 getMeals 功能?我收到一条错误消息,指出 getMeals 是一个不明确的引用。
最佳答案
extension Customer where Self:Vegan, Self:Vegetarian {
在采用者或客户同时采用素食和素食的情况下扩展客户。您的 aCustomer
(以小写字母开头的结构类型?恐怖,恐怖)不会这样做,因此扩展不适用于它。
如果目标是在采纳者采用素食或采纳者采用素食时注入(inject)相同的代码,则使用两个扩展,或者,如果您不这样做就像重复一样,让它们都采用一些“更高”的协议(protocol),该协议(protocol)扩展了要注入(inject)的所需代码。
关于Swift 协议(protocol)扩展 - 无法访问 Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51236401/