【问题标题】:Extension on nested generic types嵌套泛型类型的扩展
【发布时间】:2023-01-10 20:10:34
【问题描述】:

我有一个简单的结果类型:

enum Result<ValueType> {
    case success(ValueType)
    case failure(Error)
}

我想在结果数组和可选结果数组上创建一个函数,以将所有结果合并为一个。但是,我正在努力寻找一种表达方式。这就是我想要做的:

extension Array<Optional<Result<ValueType>>> {
    func combined() -> Result<[ValueType]>? {
        var values: [ValueType] = []
        for result in self {
            switch result {
                case .success(let value)?:
                    values.append(value)
                case .failure(let error)?:
                    return .failure(error)
                case .none:
                    return nil
            }
        }
        return .success(values)
    }
}

这显然不能编译。但有没有办法真正表达这一点?

【问题讨论】:

  • 别忘了values.reserveCapacity

标签: swift generics


【解决方案1】:

您可以简单地使用通用类型约束使 combined 函数通用,而不是使整个扩展通用。

extension Array {
    func combined<ValueType>() -> Result<[ValueType]>? where Array.Element == Optional<Result<ValueType>> {
        var values: [ValueType] = []
        for result in self {
            switch result {
            case .success(let value)?:
                values.append(value)
            case .failure(let error)?:
                return .failure(error)
            case .none:
                return nil
            }
        }
        return .success(values)
    }
}

结果:

let optionalResults: [Result<Int>?] = [Result.success(1),Result.success(2)]
optionalResults.combined() //success([1,2])
let strings = ["a","b"]
strings.combined() //doesn't compile
let ints = [1,2]
ints.combined() //doesn't compile

【讨论】:

  • 好的!这非常有效。这可能是我没有尝试过的唯一方法,叹息。
猜你喜欢
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多