Swift - Result.Success Дополнительный аргумент при вызове

У меня есть следующая функция

func refreshFeedItems(completion: @escaping ActivityFeedCompletion) {
    let currentTab = feedTab
    //Result<([FeedItem], Bool)>) -> Void
    // Load the cache in and start the spinner for the network request we're about to make
    completion(.success(cache[currentTab], true))
    ActivityFeedService.sharedInstance.refreshCommunityFeed(tab: currentTab) { result in
        // A quick user might switch tabs before this
        // call completes since we call completion twice
        guard currentTab == self.feedTab else {
            return
        }
        switch result {
        case .failure(let error):
            Log.warn(error)
            completion(.failure(error))
        case .success(let items):
            self.cache[self.feedTab] = items
            let tuple = Result.success(items,true) as ActivityFeedCompletion
           completion((tuple,false))
        }
    }
}

Но эта линия

completion(.success(cache[currentTab], true))

и этот

let tuple = Result.success(items,true) as ActivityFeedCompletion

Оба выдают мне ошибку «Дополнительный аргумент в вызове».

Это мой тип завершения активности

typealias ActivityFeedCompletion = (Result<([FeedItem], Bool)>) -> Void

Я не уверен, почему я получаю эту ошибку, я думаю, что это вводит в заблуждение, но у меня закончились идеи, что делать, чтобы исправить это.


person Koke Marrufo    schedule 19.03.2019    source источник


Ответы (2)


Вторая ошибка довольно ясна (приведение моста, скорее всего, избыточно)

let tuple = Result.success(items,true) //  as ActivityFeedCompletion

представляет уже результат, поэтому вы должны написать

completion(tuple)

Первая ошибка наверное что-то похожее, непонятно что такое cache

person vadian    schedule 19.03.2019
comment
Благодарю вас! Но однажды я исправлю эту вторую ошибку. Завершение инструкции (кортеж) выдает ту же ошибку, что и первая. Это то, что я отчаянно пытался обойти. - person Koke Marrufo; 19.03.2019
comment
Кэш следующий. fileprivate let cache = ActivityFeedCache.shared . static let shared = ActivityFeedCache() private init() { fetchFromDefaults() } - person Koke Marrufo; 19.03.2019

Вы скрываете многие важные части своего кода, поэтому мне нужно было заполнить многие части наугад. Если мой ответ далек от того, что вы ожидаете, вам лучше обновить свой вопрос и показать соответствующие части вашего кода. Например, полное определение вашего ActivityFeedCache.


С этим определением:

typealias ActivityFeedCompletion = (Result<([FeedItem], Bool)>) -> Void

Случай успеха Result вашего ActivityFeedCompletion принимает один аргумент типа кортежа ([FeedItem], Bool).

В этой строке:

completion(.success(cache[currentTab], true))

Вы передаете два аргумента в success, поэтому сообщение достаточно ясное. Вам нужно передать один аргумент.

completion(.success((cache[currentTab], true)))

И последняя часть:

let tuple = Result.success(items,true) as ActivityFeedCompletion
completion((tuple,false))

Вы совершенно ошибаетесь в типах. Result нельзя преобразовать в ActivityFeedCompletion, и вы не можете передать необработанный кортеж (tuple,false) в completion, который принимает Result<([FeedItem], Bool)>.

Пожалуйста, попробуйте что-то вроде этого:

completion(.success((items, true/* or false, which you want to pass? */)))
person OOPer    schedule 19.03.2019