2017-02-09 2 views
0

なぜこのエラーが発生するのか不思議でした。私は 'モデル'として構造体を持っており、viewDidLoad()で呼び出されるextract_data関数から初期化しますが、構造体にブレークポイントを設定すると、すべてが正しく初期化され、何か奇妙なことがわかります。それは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 

は、あなたが新たに作成されたTestStructインスタンスでbaseプロパティにアクセスしようとしているが、あなたはありません持っているということですパラメータなしのTestStructinit

必要なすべての引数を渡すことによってTestStructを作成する必要がありますが、必要なものはbaseであり、最初にインスタンスを作成するにはbaseが必要です。

+0

おかげで働いてくれてありがとうございました:)...素早い質問あなたは私のラベルがうまくいかない理由を知っていますか? –

+0

私の更新された回答を参照してください。 – rmaddy

+0

あなたは 'extract_data'で作成した' TestStruct'インスタンスを使用しません。ビューインスタンスクラスを格納するために使用できるビューコントローラクラスにプロパティを追加することをお勧めします。 'viewDidLoad'でプロパティの' base'属性を参照してください。 – rmaddy

関連する問題