2

我是 Swift 语言的新手。我创建了一个 MapKit 应用程序,它以MKPointAnnotation递归方式从 Sqlite DB(最新的 FMDB 堆栈)中检索数据(纬度、日志和标题)。

目的是把一堆兴趣点放在一个MKMapViewDelegate. 我试过不带数组,但会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)")显示所有数据,我在数组声明中弄乱了一些东西......

4

1 回答 1

3

数组声明:

var wpoint: [MKPointAnnotation] = []

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

然后,正如Swift 文档所说:

无法使用下标向数组中插入其他项:

这就是为什么您稍后会在此行中收到“致命错误:无法索引空缓冲区”错误:

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(singular) 添加注释,并且代码没有使用wpoint.
  2. 如果您真的想wpoint“一次性”使用并向地图添加注释,那么在循环中,您应该只将注释添加到数组中,然后循环之后调用addAnnotations(复数)一次并将整个数组传递给它。
  3. 用作数组索引的原始代码counter假设第一个索引是1(counter被初始化为,0但它在循环顶部递增)。在 Swift 和许多其他语言中,数组索引是从零开始的。
  4. 一个小问题,但问题中的代码不是“递归”检索数据。它正在迭代地检索数据。例如,如果initializeRoute方法调用自身,则递归将是。
于 2015-01-10T14:34:49.857 回答