【问题标题】:Swift - Result.Success Extra argument in callSwift - Result.Success 调用中的额外参数
【发布时间】:2019-03-19 17:47:31
【问题描述】:

我有以下功能

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

我不确定我为什么会收到这个错误,我认为它具有误导性,但我对如何修复它没有任何想法。

【问题讨论】:

    标签: swift completion


    【解决方案1】:

    第二个错误很清楚(桥接很可能是多余的)

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

    已经代表结果所以你必须写

    completion(tuple)
    

    第一个错误可能是类似的,不清楚cache是什么

    【讨论】:

    • 谢谢!但是一旦我修复了第二个错误。指令完成(元组)抛出与第一个相同的错误。这是我一直在努力解决的问题。
    • 缓存如下。 fileprivate 让缓存 = ActivityFeedCache.shared 。 static let shared = ActivityFeedCache() private init() { fetchFromDefaults() }
    【解决方案2】:

    您隐藏了代码的许多相关部分,因此我需要通过猜测来填充许多部分。如果我的回答与您的预期相差甚远,您最好更新您的问题并显示代码的相关部分。例如,您的ActivityFeedCache 的完整定义。


    有了这个定义:

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

    您的ActivityFeedCompletionResult 的成功案例采用元组类型([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&lt;([FeedItem], Bool)&gt;

    请尝试以下方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2015-09-13
      • 2018-08-26
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多