2016-11-04 80 views
0

我有幾個不同的自定義註釋對象。 它們都擴展了MKAnnotation類和它的協議。如何使用不同類型的對象通過mapView.annotations數組?

這至少是他們兩個看起來怎麼樣,還有幾個人,並坦率地說,他們看起來都非常相似:

我BaseAnnotation協議:

import MapKit 
/// Defines the shared stuff for map annotations 
protocol BaseAnnotation: MKAnnotation { 
var imageName: String { get } 
var coordinate: CLLocationCoordinate2D { get set } 
} 

任務給予譯註:

import UIKit 
import MapKit 

class QuestGiverAnnotation: NSObject, BaseAnnotation { 
var imageName = "icon_quest" 
var questPin: QuestPin? 

@objc var coordinate: CLLocationCoordinate2D 


// MARK: - Init 

init(forQuestItem item: QuestPin) { 
    self.questPin = item 

    if let lat = item.latitude, 
     lng = item.longitude { 
     self.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lng) 
    } else { 
     self.coordinate = CLLocationCoordinate2D(latitude: 0, longitude: 0) 
    } 
} 

init(location: CLLocationCoordinate2D) { 
    self.coordinate = location 
} 
} 

資源譯註:

import UIKit 
import MapKit 

class ResourceAnnotation: NSObject, BaseAnnotation { 
var imageName: String { 
    get { 
     if let resource = resourcePin { 
      return resource.imageName 
     } else { 
      return "icon_wood.png" 
     } 
    } 
} 
var resourcePin: ResourcePin? 
@objc var coordinate: CLLocationCoordinate2D 
var title: String? { 
    get { 
     return "Out of range" 
    } 
} 


// MARK: - Init 

init(forResource resource: ResourcePin) { 
    self.resourcePin = resource 

    if let lat = resource.latitude, 
     lng = resource.longitude { 
     self.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lng) 
    } else { 
     self.coordinate = CLLocationCoordinate2D(latitude: 0, longitude: 0) 
    } 
} 

init(location: CLLocationCoordinate2D) { 
    self.coordinate = location 
} 
} 

正如我所說,還有2-3個,但它們與這兩個差不多。 不要問我爲什麼讓他們這樣......我需要他們是這樣的。

好的,當我想通過mapView.annotations列出所有添加的地圖註釋時,就會出現問題。

我得到fatal error: NSArray element failed to match the Swift Array Element type

而且據我所知,這是因爲annotations陣列由diferent類型的對象,但我有dificulties獲得某種類型的對象。

這是我試圖讓一個註解我從數組所需要的方式之一,UT我都失敗了:

func annotationExistsAtCoordinates(lat: Double, long:Double) -> Bool{ 
    var annotationExists = false 
    **let mapAnnotations: [Any] = self.annotations** 
    for item in mapAnnotations{ 
     if let annotation = item as? QuestGiverAnnotation{ 
      if annotation.coordinate.latitude == lat && annotation.coordinate.longitude == long{ 
       annotationExists = true 
      } 
      //let annotation = self.annotations[i] as! AnyObject 
     } 
    } 

    return annotationExists 
} 

我在這一行出現錯誤:let mapAnnotations: [Any] = self.annotations

所以,我的問題是:如何從一個數組中獲取不同類型的對象而不需要獲取fatal error: NSArray element failed to match the Swift Array Element type

+0

這是運行時還是編譯時的錯誤? – ageektrapped

+0

它在運行時 – SteBra

回答

1

使用MKAnnotation數組進行初始化仍會引發錯誤。

做:

讓mapAnnotations:[AnyObject] = self.annotations

這個工作。

相關問題