2017-06-17 1 views
1

私はどこでもスコープしたい変数tbの宣言についてちょっと混乱します。この変数はJSONから来ます。どのように私の配列をすべてのスコープに初期化するのですか

私が直接JSON

var tb = json as! Array<Dictionary<String, Any>> 

からそれが働いてのinitが、それはのtableView関数にスコープいない場合。

私はまだ素早い初心者ですから、誰かが私に説明することができたらどうすればいいですか?このスコープと変数init/typeがどのように働いているのか、私はとても感謝しています。

ここでは、コードです:

class BiensViewController: UIViewController { 

@IBOutlet weak var maTable: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    var user = "" 
    var tb:[Dictionary<String, Any>] 
    super.viewDidLoad() 
    //on récupère l'utilisateur courant. 
    let fm = FileManager.default 
    let urlRepDocuments = try! fm.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) 
    let url = urlRepDocuments.appendingPathComponent("user.plist") 
    print(url) 
    if let dico = NSMutableDictionary.init(contentsOfFile: url.path){ 
     if dico["email"] != nil { 
      user = dico["email"] as! String 
     } 
    } 
    let parameters = ["email": user] 
    // 
    guard let httpUrl = URL(string: "https://mysite.000webhostapp.com/services")else{return} 
    var request = URLRequest(url: httpUrl) 
    request.httpMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return } 
    request.httpBody = httpBody 

    let session = URLSession.shared 
    session.dataTask(with: request) { (data, response, error) in 
     if let response = response { 
      print("******") 
      print(response) 
     } 

     let json:Any 
     if let data = data { 
      do { 
       json = try JSONSerialization.jsonObject(with: data, options: []) 
       //print(json) 
       tb = json as! Array<Dictionary<String, Any>> 
       print(tb) 


      } catch { 
       print(error) 
      } 
     } 

     }.resume() 


    func numberOfSections(in tableView: UITableView) -> Int 
    { 
     return 1 
    } 


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return tb.count 
    } 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     //Récupéré une cellule réutilisable 
     let cellule:BiensTableViewCell = tableView.dequeueReusableCell(withIdentifier: "maCellulePersonnalise", for: indexPath) 
      as! BiensTableViewCell 

     //peuple la cellule 
     cellule.etqRef.text = tb[indexPath.row]["ref"] as? String 
     cellule.EtqAdresse.text = tb[indexPath.row]["adresse"] as? String 
     cellule.etqCP.text = tb[indexPath.row]["cp"] as? String 
     cellule.etqVille.text = tb[indexPath.row]["ville"] as? String 
     cellule.etqNomLoc.text = tb[indexPath.row]["nom"] as? String 
     cellule.etqLoyer.text = tb[indexPath.row]["loyer"] as? String 
     return cellule 

}}} 

エラーは次のとおりです。

閉鎖によって捕獲変数 'TB' あなたはただのviewDidLoad(外変数を宣言する必要が

答えて

6

を初期化される前は)アウトレットが描かれている場所のすぐ下にあります。現在、変数はviewDidLoad()のスコープにのみ制限されています。しかし今、完全なクラスでアクセス可能になります。

class BiensViewController: UIViewController { 

@IBOutlet weak var maTable: UITableView! 
var tb = [Dictionary<String, AnyObject>]() 
//or you can use:- var tb = [Dictionary<String, Any>]() according to your requirement 
+0

こんにちは、ありがとうございます。しかし、私は最終的にそれらの '()'がエラーを消滅させる理由を理解していませんか?それはコンストラクタのようなものですか?しかしそれは関数ではなく、単に配列宣言です。 AnyObjectまたはAny(いずれかより優れていますか?)任意のカバーAnyObject?私はAnyObjectがanyにincluedされていることを意味しますか?私はAnyObjectがオブジェクトのためのものであることを意味しますか?私は正しい? :p – BenoHiT

+1

こんにちは、 まず、()の使用はオブジェクト指向プログラミングなのでエラーが消えます。素早く、使用する前に変数を初期化しなければならず、初期化するためには、 - > var tb:[Dictionary ]? そして、その型を与える場合、最後にplace()を置く必要はありませんが、=演算子を使用して値を代入すると、初期値でそれを割り当てるclass配列のinitメソッドを間接的に呼び出しています。したがって、クラスのコンストラクタを呼び出すには、最後に()を配置します。 – Ishika

+0

また、AnyObjectまたはAnyについて話した場合、 Swiftは、非特異的なタイプの作業に2つの特別なタイプを提供しています。 Anyは、関数タイプを含む、あらゆるタイプのインスタンスを全く表すことができます。 AnyObjectは、任意のクラスタイプのインスタンスを表すことができます。 さらに、 AnyおよびAnyObjectは、それらが提供する動作と機能が明示的に必要な場合にのみ使用します。コードで扱うことが期待されるタイプについては、常に具体的に記述することをお勧めします。 – Ishika

関連する問題