Swift错误:致命错误:无法索引空缓冲区

时间:2015-01-09 23:36:19

标签: ios arrays swift mapkit mkpointannotation

我是Swift语言的新手。我创建了一个MapKit应用程序,它从Sqlite DB(最新的FMDB堆栈)递归检索MKPointAnnotation数据(lat,log和title)。

目的是在MKMapViewDelegate上加上一堆兴趣点。我已经尝试了w / out数组,但是mapView.addAnnotation会覆盖任何一点并且只显示地图上的最后一个,所以我正在尝试使用数组。

我已经创建了一个函数,但是当调用wpoint数组时,我在运行时得到错误“致命错误:无法索引空缓冲区”。

以下是代码:

func initializeRoute()
{

    sharedInstance.database!.open()
    var resultSet: FMResultSet! = sharedInstance.database!.executeQuery("SELECT * FROM Route", withArgumentsInArray: nil)

    // DB Structure

    var DBorder:        String = "order"        // Int and Primary Index
    var DBlatitude:     String = "latitude"     // Float
    var DBlongitude:    String = "longitude"    // Float

    // Array declaration
    var wpoint: [MKPointAnnotation] = []

    // Loop counter init
    var counter: Int = 0

    if (resultSet != nil) {
        while resultSet.next() {
            counter = counter + 1

            wpoint[counter].coordinate = CLLocationCoordinate2DMake(
                (resultSet.stringForColumn(String(DBlatitude)) as NSString).doubleValue,
                (resultSet.stringForColumn(String(DBlongitude)) as NSString).doubleValue
            )
            wpoint[counter].title = resultSet.stringForColumn(DBorder)
            mapView.addAnnotation(wpoint[counter])

        }
    }

    sharedInstance.database!.close()

}

println ("Coordinate = \(wpoint.coordinate)")显示所有数据,我在数组声明中弄乱了......

1 个答案:

答案 0 :(得分:3)

数组声明:

var wpoint: [MKPointAnnotation] = []

创建一个数组(零元素)。

然后,正如Swift documentation所说:

  

使用下标:

无法在数组中插入其他项目

这就是你得到"致命错误的原因:无法索引空缓冲区"稍后在这一行出错:

wpoint[counter].coordinate = ...


相反,正如文档中所述,使用append方法或+=运算符。

无论哪种方式,您都需要在每次迭代时创建一个MKPointAnnotation对象,设置其属性,将其添加到数组中,然后将其传递给addAnnotation。例如:

var wpoint: [MKPointAnnotation] = []

if (resultSet != nil) {
    while resultSet.next() {

        let pa = MKPointAnnotation()

        pa.coordinate = CLLocationCoordinate2DMake(
            (resultSet.stringForColumn(String(DBlatitude)) as NSString).doubleValue,
            (resultSet.stringForColumn(String(DBlongitude)) as NSString).doubleValue
        )

        pa.title = resultSet.stringForColumn(DBorder)

        wpoint.append(pa)
        //wpoint += [pa]  //alternative way to add object to array

        mapView.addAnnotation(pa)
    }
}

请注意其他一些事项:

  1. wpoint数组首先不是必需的,因为您使用addAnnotation(单数)一次添加一个注释,而代码在wpoint处没有做任何其他事情
  2. 如果你真的想使用wpoint并在地图中添加注释"那么在循环中,你应该只将注释添加到数组然后 循环之后,调用addAnnotations(复数)一次并将整个数组传递给它。
  3. 使用counter作为数组索引的原始代码假设第一个索引是1counter已初始化为0,但它在顶部递增的循环)。在Swift和许多其他语言中,数组索引是从零开始的。
  4. 一个小问题,但问题中的代码不是"递归"检索数据。它正在迭代地检索数据。递归地是,例如,initializeRoute方法自称。