我如何初始化我的数组,范围无处不在

问题描述:

我对变量'tb'的声明有点困惑,我希望它的范围在任何地方。这个变量来自JSON。我如何初始化我的数组,范围无处不在

如果我INIT直接从JSON

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

它的工作,但它不是作用域到的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 

}}} 

的错误是:

变量“T”被初始化之前通过封闭拍摄

你只需要申报的viewDidLoad外的变量()就在绘制插座的地方。目前,您的变量仅限于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包含在任何?我的意思是AnyObject只是为了对象?我对吗 ? :p – BenoHiT

+1

嗨, 首先,最后使用()会使错误消失,因为这是一个面向对象编程。在swift中,你必须在使用之前初始化变量并进行初始化,你所要做的就是 - > var tb:[Dictionary ]? 并且在给出它的类型的情况下,您不必在最后放置(),但是当您使用=运算符为其赋值时,您将间接调用类数组的init方法,该方法使用一些初始值进行分配。因此要调用你放置()的类的构造函数。 – Ishika

+0

此外,如果我们谈论AnyObject或任何 Swift提供了两种特殊类型来处理非特定类型: 任何可以表示任何类型的实例,包括函数类型。 AnyObject可以表示任何类类型的实例。 此外, 只有当您明确需要它们提供的行为和功能时才使用Any和AnyObject。对代码中期望使用的类型进行具体说明总是更好。 – Ishika