swift - 是否可以扩展符合协议(protocol)的结构?

标签 swift generics

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

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 来表达这一点?

最佳答案

如果此计算属性应该存在于符合 CaseIterable 的所有类型上,您可以简单地扩展 CaseIterable 本身。

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

关于swift - 是否可以扩展符合协议(protocol)的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889980/

相关文章:

ios - 通过 Interface Builder 为所有 View Controller 设置默认全局背景颜色

ios - swift 中的 loadNibNamed 应该返回 Singleton 对象

c# - 将泛型函数作为参数传递

java - 使用不同的构造函数参数实例化泛型类

ios - 如何从父 UIStackView 引用和修改 subview UILabel

swift - 快速录制按钮的 Flash 动画问题

macos - Mac 应用程序窗口停止更新

c# - Mock 的通用方法(Moq 库)验证从未使用任何参数组合调用方法

java - 实现通用接口(interface)的类的子类

使用泛型的 Angular 14 严格类型 react 形式