gpt4 book ai didi

Swift:枚举中元素的索引(CaseIterable)

转载 作者:搜寻专家 更新时间:2023-11-01 06:11:45 24 4
gpt4 key购买 nike

以下代码(编译无误)检索元素的索引在特定的 CaseIterable 枚举类型中

public enum MyEnum : CaseIterable {
case ONE, TWO, THREE

public func ordinal() -> Int? {
return MyEnum.allCases.firstIndex(of: self)
}
}

我想制作一个通用函数来处理所有 CaseIterable 枚举。

如果我尝试:

 public extension CaseIterable {

public func ordinal() -> Int? {
return CaseIterable.allCases.firstIndex(of: self)
}
}

我得到一个编译器错误“Member 'allCases' cannot be used on value of protocol type 'CaseIterable'; use a generic constraint instead”,这很合乎逻辑,因为实际的枚举类型是未知的。

当我尝试 CaseIterable<T> ,我收到另一个错误,因为 CaseIterable 未声明为通用类型。

有办法吗?

最佳答案

需要做一些改变:

  1. 返回类型需要是 Self.AllCases.Index? 而不是 Int?。实际上,这些类型是等效的,如下所示。
  2. 您还需要将任何类型限制为 Equatable,因为您需要是 equatable 才能使用 firstIndex(of:)。同样,在实践中,任何 CaseIterable 通常都是一个没有关联值的枚举,这意味着它将自动相等。
  3. (可选更改)此函数永远不会返回 nil,因为您正在 CaseIterable 中找到一个案例。因此,您可以删除返回类型 (Self.AllCases.Index) 的可选性并强制解包。

例子:

public extension CaseIterable where Self: Equatable {

public func ordinal() -> Self.AllCases.Index {
return Self.allCases.firstIndex(of: self)!
}

}

enum Example: CaseIterable {

case x
case y

}

Example.y.ordinal() // 1
type(of: Example.y.ordinal()) // Int

就个人而言,我要补充一点,“Ordinal”通常意味着与您正在做的事情不同的东西,我建议将函数名称更改为 elementIndex() 或其他名称。但这是题外话。

关于Swift:枚举中元素的索引(CaseIterable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54932863/

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