代码之家  ›  专栏  ›  技术社区  ›  drekka

从可选的泛型扩展返回nil

  •  0
  • drekka  · 技术社区  · 6 年前

    这是我在玩的东西。问题是我有一个容器类,它有一个泛型参数,该参数定义了从闭包返回的类型。我想添加一个只有当泛型类型是可选的并且函数返回一个包含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())
    

    知道怎么做吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cristik    6 年前

    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