2017-02-09 1 views
0

Мне просто интересно, почему я получаю эту ошибку. У меня есть структура как «Модель» и инициализируйте ее из функции extract_data, которая вызывается в viewDidLoad(), но когда я устанавливаю точку останова в структуре, я вижу, что все было правильно инициализировано и что странно, если я беру свой ярлык и устанавливаю это к моему Struct.base String, он не работает как-то ... Я новичок так что объяснение будет действительно оценили :)Результат инициализации не используется

Вот мой 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 
    } 
} 
+0

Несвязанные, но вы должны изучить стандартные соглашения об именах. Имена должны использовать camelCase - без подчеркивания. – rmaddy

ответ

0

Ваш синтаксис для вызова инициализатора неверен. Изменение:

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

к:

let someVar = TestStruct(base: data_base, date: data_date, rates: data_rates) 

и ошибка с:

testLabel.text = TestStruct().base 

является то, что вы пытаетесь получить доступ к base собственности на вновь созданный TestStruct инстанции, но у вас есть нет init на вашем TestStruct без параметров.

Вам необходимо создать TestStruct, передав все необходимые аргументы, но это кажется бессмысленным, поскольку все, что вам нужно, это его base, и вам нужно создать base, чтобы создать экземпляр для начала.

+0

Эй, спасибо, что сработал:) ... быстрый вопрос, знаете ли вы, почему я не могу заставить работать мой лейбл? –

+0

См. Мой обновленный ответ. – rmaddy

+0

Вы никогда не используете экземпляр 'TestStruct', который вы создаете в' extract_data'. Я предлагаю добавить свойство к классу контроллера вида, которое можно использовать для хранения экземпляра структуры. Затем укажите атрибут 'base' свойства в' viewDidLoad'. – rmaddy