如何使用不同类型的对象遍历 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
这有效。
我有几个不同的自定义注释对象。 它们都扩展了 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
这有效。