Home > database >  Add explicit type to flatmap
Add explicit type to flatmap

Time:05-05

When uncommenting the code in the following code block I get the following error.

Cannot infer return type for closure with multiple statements; add explicit type to disambiguate

But I can't figure out the syntax for explicitly adding a type. How do I do it?

let path:String = path ?? Self.path
let publisher: AnyPublisher<[Self]?, Error> = NetworkableManager.getAll(path: path) 
    .flatMap {
//     if path == "menus" {
//        print("It's a menu")
//     }
       return StorableManager.shared.saveAll($0)
                
    }
    .merge(with: StorableManager.shared.fetchAll(predicate: filters))
    .eraseToAnyPublisher()

CodePudding user response:

You didn't provide a whole lot of information about the classes involved so I mocked something up to create the playground example below.

The bit that I have added is in the closure of the flatmap operator. Basically I told the compiler what type that closure will return using the fragment input -> Future<[String], Error>. To come up with that line I had to know the return type of StorageManager.shared.saveAll(items: input) so I used the value my mocked up sample returns.

Your return value may be different.

import Foundation
import Combine

class StorageManager {
    static let shared = StorageManager()

    init() {
    }

    func saveAll(items: [String]) -> Future<[String], Error> {
        Future<[String], Error> { fulfill in
                fulfill(.success(items))
        }
    }
}

struct NetworkManager {
    static func getAll(path: String) -> Future<[String], Error> {
        Future<[String], Error> { fulfill in
            fulfill(.success(["Duck", "Cow", "Chicken"]))
        }
    }
}

let path : String = "some path"
let publisher : AnyPublisher<[String], Error> =
    NetworkManager.getAll(path: path)
        .flatMap { input -> Future<[String], Error> in

             if path == "menus" {
                print("It's a menu")
             }

            return StorageManager.shared.saveAll(items: input)
        }
        .eraseToAnyPublisher()
  • Related