You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何避免为关联类型为Void的枚举显式指定(())

简化Void关联类型的TestResult枚举写法

问题说明

我们定义了类似标准Result的枚举:

enum TestResult<SuccessData, FailureData> {
    case success(SuccessData)
    case failure(FailureData)
}

当关联类型是具体数据类型时,用起来很顺畅:

let result: TestResult<TestData, FailureReport> = .success(someData)

但要是关联类型是Void,就得写成let result: TestResult<Void, Void> = .success(()),这种带(())的写法太繁琐,能不能省略?

解决方案

1. 给Void专属场景加静态属性

给TestResult写个扩展,限定关联类型都是Void时,提供不带参数的静态属性替代原来的case:

extension TestResult where SuccessData == Void, FailureData == Void {
    static var success: TestResult {
        .success(())
    }
    
    static var failure: TestResult {
        .failure(())
    }
}

之后用的时候直接写:

let result: TestResult<Void, Void> = .success

2. 单独处理单一Void关联类型

如果只是其中一个关联类型是Void,可以分开扩展:

// 仅成功类型为Void时
extension TestResult where SuccessData == Void {
    static var success: TestResult {
        .success(())
    }
}

// 仅失败类型为Void时
extension TestResult where FailureData == Void {
    static var failure: TestResult {
        .failure(())
    }
}

比如只有成功类型是Void时,就能这么写:

let result: TestResult<Void, FailureReport> = .success

3. 用类型别名减少重复声明

如果经常用到TestResult<Void, Void>,可以先定义一个类型别名:

typealias VoidResult = TestResult<Void, Void>

再结合上面的静态属性扩展,写法会更简洁:

let result: VoidResult = .success

内容的提问来源于stack exchange,提问作者Wade Tregaskis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:13:18