假设我有一个类似于标准Result类型的东西:

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

一般来说,当SuccessData和FailureData是"真实"类型而不是空类型时,这是很好的.您可以这样使用它:

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

都很好.

但是,就我的目的而言,有时这两种类型中的一种或两种都是无效的(例如,非常简单的测试类型,它们没有额外的信息要传达,只是它们是成功还是失败).在这种情况下,我显然不得不写道:

let result: TestData<Void, Void> = .success(())

这太难看了.有没有办法省略(())

推荐答案

这个更好一点:

extension TestResult where SuccessData == Void {
    static func success() -> Self {
        .success(())
    }
}

extension TestResult where FailureData == Void {
    static func failure() -> Self { 
        .failure(())
    }
}


let successfulResult: TestResult<Void, Void> = .success()
let failedResult: TestResult<Void, Void> = .failure()

单独的success()failure()静态函数位于不同的扩展中,因此另一个泛型类型可以是任何类型:

let successfulResult2: TestResult<Void, Error> = .success()
let failedResult2: TestResult<Int, Void> = .failure()

我试图使它们成为静态属性,而不是静态函数,这样它们就可以在没有括号的情况下使用,但这导致了编译器错误"泛型类型中不支持静态存储属性".

编辑:我试图用一个值来初始化静态属性,但我可以从答案中看到,链接到它的@MartinR可以用计算(computed)属性来完成:

extension TestResult where SuccessData == Void {
    static var success: Self {
        .success(())
    }
}

extension TestResult where FailureData == Void {
    static var failure: Self {
        .failure(())
    }
}

let successfulResult: TestResult<Void, Never> = .success
let failedResult: TestResult<Void, Void> = .failure

Swift相关问答推荐

动画过程中的SwiftUI重绘视图

是否在字符串属性上搜索数组和子数组?

为什么ClosedRange<;Int&>包含的速度比预期慢340万倍?

Result类型的初始值设定项失败?

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

如何在应用程序区域永久更改 NSCursor?

ClosedRange.Swift 中 Int 的索引?

如何在 Swift 中做类型安全的索引?

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

覆盖一个子元素的 HStack 对齐方式

try 制作一个 Swift 扩展来替换字符串中的多次出现

使用 Swiftui 水平修剪 Shape()

如何让不同的组件拥有不同的动画?

Swift:withCheckedContinuation 和 Dispatch QoSClass

subscribeOn 和 observeOn 的顺序重要吗?

如何从 UITableViewCell 类中引用 UITableViewController?

Swift 的 JSONDecoder 在 JSON 字符串中有多种日期格式?

使用相机进行人脸检测

使用 JSONEncoder 对类型为 Codable 的变量进行编码

如何在 iOS 上的 Swift 中获取 sharedApplication?