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

时间:2016-11-04 18:27:56

标签: swift mkannotation

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

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

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

1 个答案:

答案 0 :(得分:1)

使用MKAnnotation数组进行初始化仍会引发错误。

做的:

让mapAnnotations:[AnyObject] = self.annotations

这很有用。