Argo:类型不符合协议' Decodable'

时间:2016-05-24 09:16:38

标签: json swift protocols curry argo

我刚开始使用Argo将我的json响应解析为对象。我有以下代码(见下文),但它不断抛出以下错误:

  

键入'应用程序'不符合协议' Decodable'

     

无法调用咖喱'使用类型'的参数列表((applicationID:   String,contact:String,state:String,jobTitle:String,area:   String,pay:String) - >应用)'

import Foundation
import Argo
import Curry

struct Application {

    let applicationID: String
    let contact: String
    let state: String
    let jobTitle: String
    let area: String
    let pay: String
}

extension Application: Decodable {
    static func decode(j: JSON) -> Decoded<Application> {
        return curry(Application.init)
        <^> j <| "ApplicationID"
        <*> j <| "contact"
        <*> j <| "state" // Use ? for parsing optional values
        <*> j <| "jobTitle" // Custom types that also conform to Decodable just work
        <*> j <| "area" // Parse nested objects
        <*> j <| "pay" // parse arrays of objects
    }
}

我已将扩展的应用程序扩展为可解码,因此我不明白为什么会出现此错误。

此外,我尝试在此处添加Argo git hub页面中的示例:https://github.com/thoughtbot/Argo,结构类型为User。然而,这会引发同样的错误。

我用可可豆荚安装argo和咖喱。我还清理了我的项目,并在安装它们后重新启动。但是我仍然遇到这些错误。

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

我使用CocoaPods安装了Argo和Curry。然后尝试了以下代码。它没有任何问题,工作正常。

import UIKit

import Argo
import Curry

struct User {
    let id: Int
    let name: String
}

extension User: Decodable {
    static func decode(j: JSON) -> Decoded<User> {
        return curry(User.init)
            <^> j <| "id"
            <*> j <| "name"
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let stringJSON = "{\"id\":1, \"name\":\"Siva\"}"
        let data = stringJSON.dataUsingEncoding(NSUTF8StringEncoding)

        let json: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data!, options: [])

        if let j: AnyObject = json {
            let user: User? = decode(j)
            print("user - ", user)
        }
    }
}