从可选的通用扩展返回一个零

问题描述 投票:0回答:1

这里的东西我与播放。的问题是,我有一个具有限定从闭合返回的类型的通用参数的容器类。我想补充一个函数,仅当他们泛型类型是可选的,有功能返回包含零一个实例。

下面是我目前正在打(这不会编译)的代码:

open class Result<T>: Resolvable {

    private let valueFactory: () -> T

    fileprivate init(valueFactory: @escaping () -> T) {
        self.valueFactory = valueFactory
    }

    func resolve() -> T {
        return valueFactory()
    }
}

public protocol OptionalType {}
extension Optional: OptionalType {}

public extension Result where T: OptionalType {

    public static var `nil`: Result<T> {
        return Result<T> { nil } // error: expression type 'Result<T>' is ambiguous without more context
    }
}

我想用这样的:

let x: Result<Int?> = .nil
XCTAssertNil(x.resolve())

任何想法如何使这项工作?

swift generics optional
1个回答
1
投票

我不认为你可以用一个静态属性做到这一点,但是你可以用一个静态函数实现它:

extension Result {
    static func `nil`<U>() -> Result where T == U? {
        return .init { nil }
    }
}

let x: Result<Int?> = .nil()

功能的方式更强大的性能相比,当谈到仿制药。


更新经过一番考虑,你可以有静态属性,你只需要添加一个相关联的类型OptionalType,让你知道有什么样的可选通用参数:

protocol OptionalType {
    associatedtype Wrapped
}

extension Optional: OptionalType { }

extension Result where T: OptionalType {
    static var `nil`: Result<T.Wrapped?> {
        return Result<T.Wrapped?> { nil }
    }
}

let x: Result<Int?> = .nil

一个小小的缺点是,理论上它使任何类型的添加符合OptionalType

© www.soinside.com 2019 - 2024. All rights reserved.