Ios Swift-将NSMUTABLEARRY转换为MKAnotationViews数组

Ios Swift-将NSMUTABLEARRY转换为MKAnotationViews数组,ios,json,swift,nsmutablearray,mkannotationview,Ios,Json,Swift,Nsmutablearray,Mkannotationview,所以本质上这就是我现在所拥有的。一系列 var bars = [BarAnnotation(latitude: 42.022352, longitude: -93.650413, name: "Micky's Irish Pub", deal: "$2 Drinks 9PM-1AM"), BarAnnotation(latitude: 42.021948, longitude: -93.650348, name: "Cy's Roost", deal: "$2 Drinks 9PM-1

所以本质上这就是我现在所拥有的。一系列

var bars = [BarAnnotation(latitude: 42.022352, longitude: -93.650413, name: "Micky's Irish Pub", deal: "$2 Drinks 9PM-1AM"),

    BarAnnotation(latitude: 42.021948, longitude: -93.650348, name: "Cy's Roost", deal: "$2 Drinks 9PM-1AM")
自定义BarAnnotation类的数组。阵列的大小显然是固定的。我一直试图做的是从JSON文件加载bar数据,然后从那里创建数组

func retrieveData(){

    var filePath = NSBundle.mainBundle().pathForResource("test", ofType: "json")
    var data = NSData.dataWithContentsOfMappedFile(filePath!) as NSData
    var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

    var test = [] as NSMutableArray

    let barArray = json["bars"] as NSArray


    for bar in barArray{
        var name = bar["name"] as NSString
        var deal = bar["deal"] as NSString
        var lat = bar["lat"] as Double
        var long = bar["long"] as Double
        var negLong = -long

        var newBar = BarAnnotation(latitude: lat, longitude: negLong, name: name, deal: deal)

        test.addObject(newBar)


    }

    bars.arrayByAddingObjectsFromArray(test)
}

然后我想用这个数组“test”替换条。然而,test是一个NSMutableArray类型,bar是一个大小固定的BarAnnotations数组。当我尝试转换时,它会导致错误。我觉得这是一个简单的解决办法我只是在这里有一个困难的时间。有人吗

这是我的笔记课

class BarAnnotation: MKPointAnnotation {

var latitude, longitude, distance: Double
var name, imageName, deal: String
var location: CLLocationCoordinate2D
var loc: CLLocation
var annotation: MKPointAnnotation

init(latitude: Double, longitude: Double, name: String, deal: String) {
    self.latitude = latitude
    self.longitude = longitude
    self.name = name
    self.imageName = "image1.jpg"
    self.deal = deal
    self.distance = 0
    self.location = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
    self.loc = CLLocation(latitude: latitude, longitude: longitude)
    self.annotation = MKPointAnnotation()
    annotation.setCoordinate(self.location)
    annotation.title = name
    annotation.subtitle = deal
}
然后我尝试在这里访问它

        for bar in bars {
        var barName = bar.name.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
        var searchString = searchBar.text.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

        if barName.rangeOfString(searchString) != nil || barName.lowercaseString.rangeOfString(searchString.lowercaseString) != nil {
            var span = MKCoordinateSpanMake(0.005, 0.005)
            var region = MKCoordinateRegion(center: bar.location, span: span)
            mapView.setRegion(region, animated: true)
            mapView.selectAnnotation(bar.annotation, animated: true)
        }
    }
这就是错误所在
您的
BarAnnotation
既继承了
MKPointAnnotation
,又声明了
MKPointAnnotation
的属性-这没有意义。我假设您正在将bar.annotation作为注释添加到地图视图中-因为
BarAnnotation
继承自
MKPointAnnotation
您可以只添加
bar
本身

class BarAnnotation: MKPointAnnotation {

        var distance: Double
        var name, imageName, deal: String


        init(latitude: Double, longitude: Double, name: String, deal: String) {
            self.distance=0
            self.name = name
            self.imageName = "image1.jpg"
            self.deal = deal
            super.init()
            self.coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
            self.title = name
            self.subtitle = deal
    }

}
我发现的一件事是,即使
BarAnnotation
继承自
MKPointAnnotation
,如果您尝试直接访问
coordinate
属性,Swift也会给出一个弃用错误。解决方案是将对象强制转换为
MKPointAnnotation

for bar in bars  {
    let annotation=bar as MKPointAnnotation
    var barName = bar.name.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

    var searchString = searchBar.text.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

    if barName.rangeOfString(searchString) != nil || barName.lowercaseString.rangeOfString(searchString.lowercaseString) != nil {
        var span = MKCoordinateSpanMake(0.005, 0.005)
        var region = MKCoordinateRegion(center: annotation.coordinate, span: span)
        mapView.setRegion(region, animated: true)
        mapView.selectAnnotation(bar, animated: true)
    }
}

“当我尝试转换时,它会导致错误”您尝试了什么?确切地说,它会导致什么“错误”?当我在bars数组中循环时,我尝试访问BarAnnotation的属性,即location。但是,它不允许我访问该属性,因为bars数组以前是BarAnnotations数组,现在是NSMutableArray。您没有回答这个问题。你到底要不要帮忙?我在代码的任何地方都看不到location属性。我也没有看到您访问bars数组中任何内容的任何属性。显示导致问题的实际代码-不是准备工作,而是实际发生问题的代码并准确说明问题出在哪一行。代码是否拒绝编译?你会撞车吗?如果崩溃,崩溃日志是什么?那么这是唯一的编译错误还是众多错误之一?是的,这是唯一的错误。但是如果我把它注释掉(这是搜索地图的代码),它会运行,但是地图上没有加载任何注释。那么你会得到什么错误呢?屏幕截图中的错误消息与阵列无关消息中的错误是因为阵列复制不正确。新的数组“test”是一个NSMutableArray。当我尝试将bars数组(最初是一个BarAnnotation对象数组)设置为测试数组“bars.arrayByAddingObjectsFromArray(test)”时,我认为这就是问题所在,但我无法让它工作。错误消息不是这样说的。NSArray和NSMutableArray在内容方面不是“类型化”的,我知道,但错误消息表明.location值是错误的。那是因为它不允许我这么做。在当前酒吧的位置。你试过MkCoordinatereRegionMake吗?