我有幾個不同的自定義註釋對象。 它們都擴展了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
?
這是運行時還是編譯時的錯誤? – ageektrapped
它在運行時 – SteBra