Локальный и сетевой менеджер данных - PullRequest
0 голосов
/ 11 декабря 2018

У меня странная проблема, которую я не могу отследить.

У меня есть DataManager, который отвечает за возврат данных в мой TableViewController.Это код

typealias NewsListCompletionBlock = (Result<NewsList>) -> Void
class DataManager {
    var subManager: DataManagerProtocol
    init() {
        if (Config.isUITests()) {
            subManager = LocalDataManager()
        } else {
            subManager = NetworkDataManager()
        }
    }
}
// MARK: News data manager
extension DataManager {
    func getNewsList(completion:@escaping NewsListCompletionBlock) {
        subManager.performRequest(route: nil, decoder: JSONDecoder(), 
    completion: completion)
    }
}

. Инициализирует вспомогательный менеджер на основе того, выполняем ли мы UITests или работаем с реальным приложением.Реальное приложение работает, как и ожидалось, но LocalDataManager возвращает ошибку, которую я не могу отследить.

class LocalDataManager: DataManagerProtocol {
@discardableResult
func performRequest<T>(route: APIRouter?, decoder: JSONDecoder = JSONDecoder(), completion: @escaping (Result<T>) -> Void) -> DataRequest where T : Decodable {
    let newsListString = """
    {
    "news" : [
        {
            "id": 262,
            "category": "e",
            "title": "Scott Johnson & Paul Fowler Workshop",
            "subtitle": "Wedding Photography Workshop | 20th-24th May 2019, Italy",
            "link": "",
            "date": "2018-08-31"
        }
    ]
    }
    """
    if let jsonData = newsListString.data(using: .utf8)
    {
        let result :Result<NewsList>
        do {
            let newsListObject = try JSONDecoder().decode(NewsList.self, from: jsonData)
            result = Result.success(newsListObject)
        } catch {
            result = Result.failure(NSError(domain: "", code: 123, userInfo: nil))
        }
        completion(result)
    }
}
}

Это код LocalDataManager.Как вы можете видеть, я имитирую вызов блока завершения, предоставляя фиктивные данные, но когда я компилирую, я получаю

DataManager/LocalDataManager.swift:38:24: Cannot convert value of type 'Result<NewsList>' to expected argument type 'Result<_>'

1 Ответ

0 голосов
/ 11 декабря 2018

Это потому, что вы используете NewsList явно вместо универсального параметра.

Смена кода на следующий будет работать.

if let jsonData = newsListString.data(using: .utf8)
    {
        let result :Result<T>
        do {
            let newsListObject = try JSONDecoder().decode(T.self, from: jsonData)
            result = Result.success(newsListObject)
        } catch {
            result = Result.failure(NSError(domain: "", code: 123, userInfo: nil))
        }
        completion(result)
    }
...