2015-01-09 60 views
2

我是Swift語言的新手。我創建了一個MapKit應用程序,它從Sqlite DB(最新FMDB堆棧)遞歸檢索MKPointAnnotation數據(經緯度,日誌和標題)。Swift錯誤:致命錯誤:無法索引空緩衝區

目的是在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)")顯示所有的數據,我搞亂數組聲明中的一些信息

回答

3

數組聲明:

var wpoint: [MKPointAnnotation] = [] 

創建數組(零元素)。

然後,隨着Swift documentation說:

It is not possible to insert additional items into the array using subscripting:

這就是爲什麼你的 「致命錯誤:無法索引空緩衝區」 的錯誤後來在這條線:

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,則會遞歸。
+0

謝謝Anna,我已經解決了重新聲明Array:'var wpoint:Array = Array()',現在它可以工作! :) – 2015-01-10 16:49:31

+0

我已經實施了你的建議,非常感謝! – 2015-01-10 17:03:22