gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 13:52:14 26 4
gpt4 key购买 nike

我正在尝试实现一个协议(protocol),该协议(protocol)需要一个函数,该函数应返回符合 CaseIterable 的类型的 Type。当我调用该函数时,我希望能够在返回的泛型类型上调用 .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 上运行该代码时,我得到:

error: experiments.playground:7:58: error: generic parameter T could not be inferred let a = self.dataSource?.caseIterable(for: self).allCases

有什么方法可以实现预期的功能?

最佳答案

虽然我不确定您要完成什么,但看起来您可以使用对类型有一些特定约束的通用函数。通过将 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>(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>(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)

关于swift - 从函数返回通用的符合 CaseIterable 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54400458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com