Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 未使用初始值设定项的结果_Json_Swift_String_Url_Swift3 - Fatal编程技术网

Json 未使用初始值设定项的结果

Json 未使用初始值设定项的结果,json,swift,string,url,swift3,Json,Swift,String,Url,Swift3,我只是想知道为什么我会犯这个错误。我将struct设置为“Model”,并从extract_data函数初始化它,该函数在viewDidLoad()中调用,但当我在struct中设置断点时,我可以看到所有内容都已正确初始化,奇怪的是,如果我将标签设置为struct.base字符串,不知怎的,它不起作用……我是一个初学者,所以请给出一个解释:) 这是我的ViewController: override func viewDidLoad() { super.viewDidLoad()

我只是想知道为什么我会犯这个错误。我将struct设置为“Model”,并从
extract_data
函数初始化它,该函数在
viewDidLoad()
中调用,但当我在struct中设置断点时,我可以看到所有内容都已正确初始化,奇怪的是,如果我将标签设置为
struct.base字符串
,不知怎的,它不起作用……我是一个初学者,所以请给出一个解释:)

这是我的
ViewController

override func viewDidLoad() {
    super.viewDidLoad()

    get_data("https://api.fixer.io/latest?base=CHF")

    testLabel.text = TestStruct().base
    //ANOTHER ERROR HERE (MISSING ARGUMENT FOR PARAMETER "base" IN CALL)
}

@IBOutlet var testLabel: UILabel!

var test:[TestStruct] = [TestStruct]()

func get_data(_ link:String){

    let url:URL = URL(string: link)!
    let sessioin = URLSession.shared

    let request = URLRequest(url: url)

    let testtask = sessioin.dataTask(with: request, completionHandler: { (data, response, error) in
        self.extract_data(data)
    })

    testtask.resume()
}

func extract_data(_ data:Data?){
    let json:Any?

    if(data==nil){
        return
    }

    do {
        json = try JSONSerialization.jsonObject(with: data!, options: [])

        //The whole JSON
        let data_dictonary = json as? [String: Any]

        //Just the "base"
        let data_base = data_dictonary?["base"] as! String
        print(data_base)

        //Just the "date"
        let data_date = data_dictonary?["date"] as! String
        print(data_date)

        //All the exchange rates
        let data_rates = data_dictonary?["rates"] as! [String: Double]
        print(data_rates)

        TestStruct.init(base: data_base, date: data_date, rates: data_rates)
        //ERROR IS HERE

    }catch {
        return
    }
}
这是我的模型:

struct TestStruct {
    var base: String
    var date: String
    var rates: [String: Double]

    init(base: String, date: String, rates: [String:Double]) {
        self.base = base
        self.date = date
        self.rates = rates
    }
}

您调用初始值设定项的语法不正确。更改:

TestStruct.init(base: data_base, date: data_date, rates: data_rates)
致:

错误是:

testLabel.text = TestStruct().base
您正试图在新创建的
TestStruct
实例上访问
base
属性,但在
TestStruct
上没有
init
,没有参数


您需要通过传递所有必需的参数来创建
TestStruct
,但这似乎毫无意义,因为您只需要它的
base
,并且您需要
base
来创建实例开始。

嘿,感谢它起作用了:)…快速问题您知道我为什么不能让标签工作吗?您从未使用
TestStruct
extract\u data
中创建的实例。我建议在视图控制器类中添加一个属性,用于存储结构实例。然后在
viewDidLoad
中引用属性的
base
属性。这不是正确的语法。您需要
var-test:TestStruct?
。在
extract\u data
中,而不是
让someVar=TestStruct…
执行
test=TestStruct…
。在
viewdiload
中使用
testLabel.text=test?.base
。好的,我在viewdiload中设置了一个断点进行检查,结果仍然为零,但是为什么…不相关,但您应该学习标准命名约定。名称应使用大小写-无下划线。
testLabel.text = TestStruct().base