gpt4 book ai didi

swift - 如何扩展协议(protocol)添加计算静态变量

转载 作者:行者123 更新时间:2023-12-01 23:57:00 25 4
gpt4 key购买 nike

我想扩展 CaseIterable 协议(protocol),以便所有 CaseIterable 枚举都有一个返回随机大小写的 random 静态变量。这是我试过的代码

public extension CaseIterable {
static var random<T: CaseIterable>: T {
let allCases = self.allCases
return allCases[Int.random(n: allCases.count)]
}
}

但是编译失败。有没有办法使用静态变量来实现这一点?或者,如果没有,我将如何编写等效的静态函数?

附言Int.random extension for anyone playing along home:

public extension Int {
static func random(n: Int) -> Int {
return Int(arc4random_uniform(UInt32(n)))
}
}

最佳答案

您不能在计算属性上创建通用类型。不需要随机化索引。您可以使用 Collection 的 randomElement 方法返回随机大小写并返回 Self:

public extension CaseIterable {
static var random: Self { allCases.randomElement()! }
}

Playground 测试:

enum Test: String, CaseIterable {
case a, b, c, d, e
}

let test: Test = .random // d

如果您想返回一个随机值,您可以将 Self 限制为 RawRepresentable 并返回 RawValue:

public extension CaseIterable where Self: RawRepresentable {
static var randomValue: RawValue { allCases.randomElement()!.rawValue }
}

enum Test: String, CaseIterable {
case a, b, c, d, e
}

let test = Test.randomValue   // "c"

关于swift - 如何扩展协议(protocol)添加计算静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62614793/

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