Swift 协议(protocol)扩展 - 无法访问 Func

标签 swift protocols

如果我有一系列这样的协议(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 是一个不明确的引用。

enter image description here

最佳答案

extension Customer where Self:Vegan, Self:Vegetarian {

在采用者或客户同时采用素食和素食的情况下扩展客户。您的 aCustomer(以小写字母开头的结构类型?恐怖,恐怖)不会这样做,因此扩展不适用于它。

如果目标是在采纳者采用素食采纳者采用素食时注入(inject)相同的代码,则使用两个扩展,或者,如果您不这样做就像重复一样,让它们都采用一些“更高”的协议(protocol),该协议(protocol)扩展了要注入(inject)的所需代码。

关于Swift 协议(protocol)扩展 - 无法访问 Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51236401/

相关文章:

python - 哪个标准异常类用于违反协议(protocol)?

sql-server - 最快的 SQL Server 协议(protocol)?

ios - Swift 协议(protocol)只能设置吗?

iOS - 设置 'rootViewController' 仅在设备上导致黑屏

swift - 如何在没有固定宽度的情况下将文本包装在 UILabel 中(通过 UIViewRepresentable)?

ios - 快速数组到 C 数组

swift - 将自定义属性保存到 Kinvey 用户

swift - 更改表格 View 高度后,CellForRowAt 不会调用

蓝牙协议(protocol)?

使用嵌入式 FPGA 中的 MAC 地址与套接字进行通信