我有几个不同的自定义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
的情况下从一个数组中获取不同类型的对象?
答案 0 :(得分:1)
使用MKAnnotation数组进行初始化仍会引发错误。
做的:
让mapAnnotations:[AnyObject] = self.annotations
这很有用。