【发布时间】:2019-01-28 10:58:19
【问题描述】:
我正在尝试实现一个协议,该协议需要一个函数,该函数应返回符合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
}
}
当试图在操场上运行该代码时,我得到:
错误:experiments.playground:7:58:错误:无法推断通用参数
Tlet a = self.dataSource?.caseIterable(for: self).allCases
有没有办法实现预期的功能?
【问题讨论】:
-
Swift 应该如何推断
T的类型?您绝对没有提供任何相关信息。 -
假设我只想调用.allCases.count,编译时需要知道类型吗?
-
.allCases.count什么?如果您想知道 something 有多少个 case,则必须指定该 something。例如,你不能测量一些现实生活中物体 X 的长度或重量,除非你有它,对吗?你不能把它抽象掉。 -
我明白你的意思。如果您认为该问题有效,您介意添加答案吗?
-
您需要协议吗?泛型函数似乎与协议无关。
标签: swift generics enums swift-protocols