首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么守卫要破坏类型推断?

为什么守卫要破坏类型推断?
EN

Stack Overflow用户
提问于 2018-05-31 21:02:33
回答 3查看 172关注 0票数 2

我遇到了一个问题,就像标题所描述的那样:由于某种原因,guard语句破坏了类型推断。我已经创建了一个Playground项目来解决这个问题。

下面是一些用于设置的样板代码:

代码语言:javascript
复制
import Foundation

struct Model: Decodable {
    var i: String
}

let jsonString = """
{
    "i": "yes"
}
"""

let jsonData = jsonString.data(using: .utf8)
let theModel = try JSONDecoder().decode(Model.self, from: jsonData!)

struct Response<T> {
    var decodedData: T?
}

enum Result<Value> {
    case success(Value)
    case failure
}

struct Client {
    static let shared = Client()
    private init() {}

    func execute<T: Decodable>(completion: (Response<T>) -> ()) {
        let decodedData = try! JSONDecoder().decode(T.self, from: jsonData!)
        completion(Response(decodedData: decodedData))
    }
}

以下是问题所在:

代码语言:javascript
复制
struct ServicesA {
    func loadSomething(completion: (Result<Model>) -> ()) {
        Client.shared.execute { result in      // error: generic parameter 'T' could not be inferred
            guard let decodedData = result.decodedData else { return }
            completion(Result.success(decodedData))
        }
    }
}

struct ServicesB {
    func loadSomething(completion: (Result<Model>) -> ()) {
        Client.shared.execute { result in
            completion(Result.success(result.decodedData!))
        }
    }
}

ServicesA会中断,而ServicesB会编译。

正如您所看到的,唯一的区别是guard let decodedData = result.decodedData else { return }。它破坏了类型推断,因此Client.shared.execute函数会报告无法推断出T

我想知道为什么会发生这种情况,以及处理这个问题最合适的方法是什么。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50625011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档