从函数返回符合CaseIterable的通用类型

问题描述 投票:0回答:1

我正在尝试实现一个需要一个函数的协议,该函数应该返回符合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
    }
}

当我试图在游乐场中运行该代码时,我得到:

错误:experiments.playground:7:58:错误:无法推断通用参数T let a = self.dataSource?.caseIterable(for: self).allCases

有没有办法实现预期的功能?

swift generics enums swift-protocols
1个回答
0
投票

虽然我不确定你要完成什么,但看起来你可以使用一个泛型函数,对类型有一些特定的约束。通过将T限制为RawRepresentable和CaseIterable,您可以将枚举类型作为参数传递,并在函数中调用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) 
© www.soinside.com 2019 - 2024. All rights reserved.