致命错误:索引超出范围

时间:2016-04-24 00:34:07

标签: arrays swift

我收到此错误:致命错误:索引超出范围。我无法得到我做错的事情。我想要做的是,使用整数索引访问数组字典传递一个字符串来获取映射到它的值。样本在操场上工作正常,但不是为什么? (数组字典不为空) I have run the same code on playground and it worked the xcode error the array is not empty  这是我的代码

var CondoIndivi2 = [[String:AnyObject]]()


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    scrollView.contentSize.height = 1500


    print(CondoIndivi2)
    if let description_Condo = self.CondoIndivi2[0]["description"] as? String {

       print(description_Condo)

    }



}




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


 }

这是将数据发送到CondoIndivi2的视图

        import UIKit
        import  Alamofire
        import SwiftyJSON

       class SignleCondoTableViewController: UITableViewController {
@IBOutlet var tableview: UITableView!

var singleCondoData =  [[String:AnyObject]]()
var CondoIndivi = [[String:AnyObject]]()

override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between  presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()

    self.tableView.delegate = self
    self.tableView.dataSource = self
     }

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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int      {
    // #warning Incomplete implementation, return the number of sections
    return 1
     }

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return singleCondoData.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SignleTableTableViewCell


    if singleCondoData.count != 0 {


        let dict = singleCondoData[indexPath.row] as NSDictionary


        //cell.label1.text? = (dict["name"] as? String)!

        if let nullcheck = (dict["address"] as? String) {
            cell.label2.text? = nullcheck
        }

    }



    return cell
     }



override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let dict = singleCondoData[indexPath.row] as NSDictionary


    if let unitNullCheck = (dict["mls_number"] as? String) {
        let item_id = unitNullCheck
        getCondoUnits(item_id)
        print(item_id)

        }



      }

      //get the individual condo id

func getCondoUnits(condo_id : String){


    Alamofire.request(.GET, "http://android.goidx.com/search/?mls_number=" + String(condo_id)).validate().responseJSON { response in

        if let value  = response.result.value {
            let json = JSON(value)

            if let resData = json.arrayObject {

                self.CondoIndivi = resData as! [[String:AnyObject]]

                print(self.CondoIndivi)


            }

            if self.CondoIndivi.count > 0 {

                self.tableview.reloadData()
            }


         }

        }

        }



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier = segue.identifier {


        switch identifier  {

        case "details" :


            let buildingdDetailVC = segue.destinationViewController as! DetailsViewController


            buildingdDetailVC.CondoIndivi2  = self.CondoIndivi
         default:
            break
        }

          }

        }







/*
// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return false if you do not want the specified item to be editable.

2 个答案:

答案 0 :(得分:0)

正如@James在评论中所说,你在代码中创建了一个空数组:

var CondoIndivi2 = [[String:AnyObject]]()

然后你试图在位置0中访问索引:

if let description_Condo = self.CondoIndivi2[0]["description"] as? String {
   print(description_Condo)
}

当然,你的运行时错误为Index of out Range,因为你的数组是空的,你总是需要确保在索引数组之前索引大于零,小于等于数组和数组不为空。

我希望这对你有所帮助。

答案 1 :(得分:0)

getCondoUnits(condo_id : String)内部是一个异步块(Alamofire.request),CondoIndivi2的接收时间晚于执行viewDidLoad。您应该将condo_id传递给下一个viewController并在其中执行请求。