【问题标题】:How does "let JSON" work in Alamofire/Swift“让 JSON”如何在 Alamofire/Swift 中工作
【发布时间】:2016-04-04 19:35:13
【问题描述】:

here 我看到处理 JSON 响应时正确的 Alamofire 2/Swift 2 语法是:

Alamofire.request(.GET, URLString, parameters: ["foo": "bar"])
.responseJSON { request, response, result in
    switch result {
    case .Success(let JSON):
        print("Success with JSON: \(JSON)")

    case .Failure(let data, let error):
        print("Request failed with error: \(error)")

        if let data = data {
            print("Response data: \(NSString(data: data, encoding: NSUTF8StringEncoding)!)")
        }
    }
}

let JSON 是如何以及在哪里定义的? (从 Swift 的角度来看。)

我在请求扩展中看到 ResponseSerializer 返回 .Success(JSON) 但为什么处理程序没有像通常的函数那样定义:

case .Success(JSON: AnyObject?) {
    print("Success with JSON: \(JSON)")
}

或者更好:

case .Success(JSON: NSDictionary?) {
    print("Success with NSDictionary: \(JSON)")
}

【问题讨论】:

  • 没有在任何地方定义,这只是使用枚举内部数据的语法。

标签: json swift enums closures alamofire


【解决方案1】:

result 是枚举,带有 .Success.Failure 的案例。 Swift 中的枚举 case 可以保存一些值(顺便说一下,这就是 Swift 中的 Optionals 的工作方式,它们是具有两种 case Some:包装值和 None 的枚举)。通过在 switch 中调用 case .Success(let JSON):,您可以将此值分配给 JSON 常量,您可以在 case 块中使用它。自动推断此常量的类型。

有关它的更多信息,请查看Swift Language Guide 中的“关联值”段落

【讨论】:

  • 所以基本上result.value 被设置为JSON?
  • @boidkan 看起来像,result.value 的类型是Value? 还不太明白,不过好像和老的NSValue wrapper(?) 差不多。跨度>
  • 您收到 result 作为处理程序的参数之一,它作为 responseJSON 方法的参数传递。 result 是一个枚举,您可以使用您询问的语法访问与此枚举关联的值。你没有在那里设置任何东西。在这里github.com/Alamofire/Alamofire/blob/master/Source/Result.swift,您可以看到实际调用result.value 与您的问题一样。
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 2017-02-18
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多