从可选的泛型扩展返回 nil



这是我在玩的东西。问题是我有一个容器类,它有一个泛型参数,该参数定义从闭包返回的类型。我想添加一个函数,该函数仅在通用类型是可选的时才可用,并让该函数返回包含 nil 的实例。

这是我目前正在玩的代码(无法编译(:

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())

知道如何使这项工作吗?

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

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

最新更新