Avatar
@swift-5.4.3 struct APIResponse<Value>: Decodable where Value: Decodable { var value: Value? var error: APIResponseError? func result() -> Result<Value, Error> { print("result") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (_, _): return .failure(APIResponseError(code: -1)) } } func result<Wrapped>() -> Result<Value, Error> where Value == Wrapped? { print("result optional") switch (value, error) { case (let value?, nil): return .success(value) case (nil, let error?): return .failure(error) case (nil, nil): return .success(nil) case (_, _): return .failure(APIResponseError(code: -1)) } } } struct APIResponseError: Error, Decodable { var code: Int } struct User: Codable {} let r1: APIResponse<User> = .init(value: nil, error: nil) print(r1.result()) let r2: APIResponse<User?> = .init(value: nil, error: nil) print(r2.result())