Непосредственно вернуть значение перечисления со связанным типом - PullRequest
0 голосов
/ 13 марта 2019

Это мой код:

enum Pet {
    case dog(Int), cat(String)
}

protocol PetHolder {
    associatedtype Food

    func determineFood(from: Pet) -> Food?
}

struct DogHolder: PetHolder {
    typealias Food = Int

    func determineFood(from: Pet) -> Int? {
        // Possible one liner? Enum extension?
        switch from {
        case .dog(let food):
            return food
        default:
            return nil
        }
    }
}

В реальном коде Pet - это сгенерированное огромное перечисление. У нас есть много классов, таких как DogHolder, которые должны извлекать данные, основанные на связанном типе случая в Pet.

Невозможно написать для каждого XHolder следующее (как показано выше):

// Possible one liner? Enum extension?
switch from {
    case .dog(let food):
        return food
    default:
        return nil
    }
}

Это приведет к сотням строк, в которых только case .dog(let food): будет другим.

Я хочу посмотреть, содержит ли он конкретный случай, и вернуть тот единственный тип перечисления, который в точности совпадает с ассоциированным типом протокола, который он реализует. Enum Pet всегда имеет одно ассоциированное значение (опять же, оно точно соответствует протоколу, который реализует объект).

Edit:

Я получил это сейчас, но могу ли я удалить else if и встроить возможное значение nil?

if case let Pet.dog(food) = from {
   return food
} else {
    return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...