如何使用不同类型的对象遍历 mapView.annotations 数组?

How to go through mapView.annotations array with objects of different type?

我有几个不同的自定义注释对象。 它们都扩展了 MKAnnotation class 及其协议。

至少有两个是这样的,还有几个,坦率地说,它们看起来都非常相似:

我的 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 数组由不同类型的对象组成,但我在获取特定类型的对象时遇到困难。

这是我尝试从数组中获取我需要的注释的方法之一,但我失败了:

    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 的情况下从一个数组中获取不同类型的对象?

使用 MKAnnotation 数组初始化仍然会抛出错误。

做:

让 mapAnnotations: [AnyObject] = self.annotations

这有效。