首页 > 解决方案 > 是否可以扩展符合协议的结构?

问题描述

我正在使用SwiftCheck进行基于属性的测试,并且我想为几个enum符合CaseIterable协议的 s 生成随机元素。我认为与其为所有enums 编写相同的代码,不如执行以下操作:

extension Any: Arbitrary where Self: CaseIterable {
    public static var arbitrary: Gen<Self> {
        return Gen<Self>.fromElements(of: Self.allCases)
    }
}

这无法编译有几个原因,主要原因是

Error:(13, 1) non-nominal type 'Any' cannot be extended

有什么方法可以在 Swift 中表达这一点?

标签: swiftgenerics

解决方案


如果CaseIterable这个计算属性应该存在于所有符合CaseIterable.

extension Arbitrary where Self: CaseIterable {
    public static var arbitrary: Gen<Self> {
        return Gen<Self>.fromElements(of: Array(Self.allCases))
    }
}

推荐阅读