2014-12-10 12 views
-1

그래서 내가 현재 가지고있는 것이 필수적입니다. 배열은스위프트 - NSMutableArray를 MKAnotationViews의 배열로 변환

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 파일에서 막대 데이터를로드 한 다음 배열을 작성하려고했습니다.

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"배열로 바 꾸었습니다. 그러나 테스트는 NSMutableArray 유형이고 bars는 크기가 고정 된 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 클래스이며,이 오류 enter image description here

+0

에 개체를 캐스팅하는 것입니다? – matt

+0

바 배열을 반복 할 때 위치 인 BarAnnotation의 속성에 액세스하려고합니다. 그러나 Bar 배열은 BarAnnotations의 배열이었고 이제는 NSMutableArray이기 때문에이 속성에 액세스 할 수 없습니다. – leerob

+0

질문에 답변하지 않았습니다. 도움을 원하니? 귀하의 코드에서 아무 위치 속성도 볼 수 없습니다. 바 배열의 모든 물건에 액세스하는 것도 보지 않습니다. 문제를 일으키는 실제 코드를 보여줍니다. 사전 준비 사항이 아니라 문제가 실제로 발생하는 실제 코드입니다! - 그리고 정확히 무엇이 문제인지를 정확히 설명하십시오. 코드가 컴파일을 거부합니까? 추락 하시겠습니까? 충돌이 발생하면 충돌 로그는 무엇입니까? – matt

답변

0

귀하의 BarAnnotation입니다 MKPointAnnotation에서 상속 모두와 선언이다 MKPointAnnotation의 속성 - 이것은 이해가되지 않습니다. . 나는지도보기에 주석으로 bar.annotation을 추가한다고 가정합니다. BarAnnotationMKPointAnnotation에서 상속되므로 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 
    } 

} 

한 것은 당신이 시도하고 직접 coordinate 속성에 액세스하는 경우 MKPointAnnotation에서 비록 BarAnnotation 상속이, 스위프트가 중단 오류를 준다이다. 이 솔루션은 원인 않았다 "나는 오류를 일으키는 변환하려고하면"당신이 무엇을하려고 않았고 정확히 무엇을 "오류"는 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) 
    } 
} 
+0

그래서 오류가 무엇입니까? 스크린 샷의 오류 메시지는 배열과 관련이 없습니다. – Paulw11

+0

메시지의 오류는 배열이 올바르게 복사되지 않기 때문입니다. 새로운 배열 "test"는 NSMutableArray입니다. barAnnotation 객체 배열 인 bar 배열을 "bar.arrayByAddingObjectsFromArray (test)"라는 테스트 배열에 설정하려고하면 문제가있는 곳을 찾을 수 있지만 제대로 작동하지 않습니다. – leerob

+0

그건 오류 메시지가 말하는 것과 다릅니다. NSArray와 NSMutableArray는 그 내용이 "입력 된"것이 아닙니다. – Paulw11