Возврат универсального CaseIterable-соответствующего типа из функции - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь реализовать протокол, требующий функции, которая должна возвращать Type типа, соответствующего CaseIterable.Когда я вызываю эту функцию, я ожидаю, что смогу вызвать .allCases для возвращенного универсального типа.К сожалению, компилятор не позволит мне.

protocol FooDataSource: class {
    func caseIterable<T: CaseIterable>(for foo: Foo) -> T.Type
}

class Foo {
    weak var dataSource: FooDataSource?

    func callAllCasesProperty() {
        let a = self.dataSource?.caseIterable(for: self).allCases
    }
}

При попытке запустить этот код на игровой площадке я получаю:

ошибка: эксперименты. Playground: 7: 58: ошибка: универсальный параметр T не может быть выведен let a = self.dataSource?.caseIterable(for: self).allCases

Есть ли способ, которым я могу достичь предполагаемой функциональности?

1 Ответ

0 голосов
/ 19 февраля 2019

Хотя я не совсем уверен, чего вы пытаетесь достичь, похоже, вы могли бы использовать универсальную функцию с некоторыми конкретными ограничениями на тип.Ограничив T значением RawRepresentable & CaseIterable, вы можете передать в качестве аргумента тип enum и вызвать allCases в функции.

enum Direction: String, CaseIterable {
    case north
    case south
    case east
    case west
}

enum Weight: Int, CaseIterable {
    case Light = 1
    case Mid = 4
    case Heavy = 10
}

func genericMethod<T : RawRepresentable & CaseIterable>(enum enumType: T.Type) {
    for aCase in enumType.allCases {
        print(aCase.rawValue)
    }
}

genericMethod(enum: Direction.self) // prints -> north, south, east, west
genericMethod(enum: Weight.self) // prints -> 1, 4, 10

Вы также можете дополнительно ограничить тип T следующим образом:

func genericMethodWithRawConstraint<T : RawRepresentable & CaseIterable>(enum enumType: T.Type) where T.RawValue == String {
    for aCase in enumType.allCases {
        print(aCase.rawValue)
    }
}

//Will not compile because Weight is of type Int
//genericMethodWithRawConstraint(enum: Weight.self) 
...