Swift - Result.Success Дополнительный аргумент в вызове - PullRequest
0 голосов
/ 19 марта 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 19 марта 2019

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

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

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

completion(tuple)

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

0 голосов
/ 20 марта 2019

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


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

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

В случае успеха Result вашего ActivityFeedCompletion требуется single аргумент типа кортежа ([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? */)))
...