2017-02-10 124 views
-1

maindata我有这个问题(键入任何没有标名成员)在这一行`误差在3迅速

import Foundation 
import UIKit 
import WebKit 
import GoogleMobileAds 

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,GADBannerViewDelegate {  

    @IBOutlet weak var BannerView: GADBannerView! 

    @IBOutlet var tableView: UITableView! 
    @IBAction func refresh(_ sender: AnyObject) { 
     get() 
    } 

    var values:NSArray = [] 

    override func viewDidLoad() { 
     super.viewDidLoad(); 

     let request = GADRequest() 
     request.testDevices = [kGADSimulatorID] 
     BannerView.delegate = self 
     BannerView.adUnitID = "" 
     BannerView.rootViewController = self 
     BannerView.load(request) 

     get(); 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func get(){ 
     let url = URL(string: "http://www.X.php") 
     let data = try? Data(contentsOf: url!) 
     values = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 

     tableView.reloadData()    
     } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return values.count; 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SpecialCell 

     let maindata = values[(indexPath as NSIndexPath).row] 

     cell.info!.text = maindata ["Info"] as String? 

     return cell; 
    } 
} 

image

谢谢大家..

+2

请花些时间来很好地设置您的问题。使用'{}'按钮来格式化代码。删除多个空行。指定在哪一行发生错误。 – Codo

+2

你的问题的原因是使用'NSArray'。它缺少任何类型的信息。进一步 - 但没有关系 - '.mutableContainers'在Swift中完全没有意义,并且从远程URL同步加载数据是非常糟糕的编程习惯。 – vadian

回答

0

我相信你有给mainData一种类型是这样的:

let maindata = values[(indexPath as NSIndexPath).row] as? [String:Any]

然后确保mainData实际上包含了值

所有的
if let info = mainData?["Info"] as? String { 
    cell.info!.text = info 
} 
+0

谢谢你的工作 – hamid

1

首先声明的数据源数组斯威夫特Array。 Foundation NSArray没有类型信息,完全不能帮助Swift的强大类型系统。

var values = [[String:Any]]() 

然后异步加载数据(!),并在cellForRow重新加载表视图在主线程

func get() { 
    let url = URL(string: "http://www.X.php")! 
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
     if error != nil { 
      print(error!) 
     } else { 
      do { 
       self.values = try JSONSerialization.jsonObject(with: data!, options: []) as! [[String:Any]] 
       DispatchQueue.main.async { 
       self.tableView.reloadData() 
       } 
      } catch { 
       print(error) 
      } 
     }   
    } 
    task.resume() 
} 

然后分配值

let maindata = values[indexPath.row] 
cell.info!.text = maindata["Info"] as? String 

现在编译器知道所有的下标类型和错误消失。