Swift Enum: проблема соответствия шаблону выражения - PullRequest
1 голос
/ 21 мая 2019

Я пытался смешать пользовательские связанные значения со строкой в ​​Enum, но не смог этого сделать.Когда я пытаюсь применить регистр переключения к перечислению, я получаю эту ошибку: шаблон выражения типа 'Fruit' не может соответствовать значениям типа 'Fruit'

Это потому, что строки являются типами значений и, следовательно, Swift можетсравнить их, но не пользовательский объект класса Fruit, который является ссылочным типом?

class Fruit{
    let name: String?
    let energyKcl: Double?
    let costPerKg: Double?

    init(name:String, energyKcl: Double, costPerKg: Double) {
        self.name = name
        self.energyKcl = energyKcl
        self.costPerKg = costPerKg
    }
}

enum Calorie {
    case fruit(Fruit)
    case chocolate (String)
    case dairy(String)
    case Nuts(String)
}


let banana = Fruit.init(name: "Banana", energyKcl: 100, costPerKg: 10)

func prepareBreakfast(calories: Calorie){
    switch calories {

    case .chocolate("Dark"):
        print("Dark")

    case .chocolate("White"):
        print("White")

    case .fruit(banana): //Error: Expression pattern of type 'Fruit' cannot match values of type 'Fruit'
        print("banana")

    default:
        print ("Not available")
    }
}

prepareBreakfast(calories: .fruit(banana))

Ответы [ 3 ]

2 голосов
/ 21 мая 2019

Нет, проблема в том, что пользовательский класс не сопоставим без Equatable протокола

extension Fruit: Equatable {

    static func == (lhs: Fruit, rhs: Fruit) -> Bool {
        return lhs.name == rhs.name
        && lhs.energyKcl == rhs.energyKcl
        && lhs.costPerKg == rhs.costPerKg
    }

}
1 голос
/ 21 мая 2019

При сопоставлении с образцом внутренне используется Equatable, поэтому вы должны изменить класс Fruit:

extension Fruit: Equatable {
    static func == (lhs: Fruit, rhs: Fruit) -> Bool {
        return lhs.name == rhs.name // or every field if you want
    }
}

Если вы хотите использовать ссылку, просто измените функцию ==, чтобы она возвращала true, если обассылки равны, но я не думаю, что это хорошая идея:

static func == (lhs: Fruit, rhs: Fruit) -> Bool {
    return lhs === rhs
}
0 голосов
/ 21 мая 2019

В вашем коде

Замените нижеприведенную строку в методе prepareBreakfast(calories:),

case .fruit(banana):

на

case .fruit(let banana):

И все готово.Я не думаю, что есть другие проблемы с вашим кодом.Он отлично работает на моем конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...