2016-12-18 2 views
0

Следующая функция, в которой я повторяю элементы в plist, отлично работает в Swift 1, возможно Swift 2, но определенно не Swift 3. Сделав попытку переопределить NSDictionary как словарь вместо этого, он запрашивает типы, которые будут храниться в словаре, но при попытке использовать различные варианты, такие как строка или даже любое, оно не компилируется , Поэтому я переключился обратно держать его как NSDictionary, но эта ошибка меня в тупик:Тип 'NSDictionary.Iterator.Element' (aka '(key: Any, value: Any)') не имеет подстрочных индексов

Type 'NSDictionary.Iterator.Element' (aka '(key: Any, value: Any)') has no subscript members 

Эта ошибка появляется при установке константы: точка, название, typeRawValue и субтитров.

func addAttractionPins() { 

      var myDict: NSDictionary? 
      if let filePath = Bundle.main.path(forResource: "GeorgiaHumanAnnotations", ofType: "plist"){ 
       myDict = NSDictionary(contentsOfFile: filePath) 
      } 
      if let dict = myDict { 
       for attraction in dict { 
        let point = CGPointFromString(attraction["location"] as! String) 
        let coordinate = CLLocationCoordinate2DMake(CLLocationDegrees(point.x), CLLocationDegrees(point.y)) 
        let title = attraction["name"] as! String 
        let typeRawValue = Int((attraction["type"] as! String))! 
        let type = HumanAnnotationType(rawValue: typeRawValue)! 
        let subtitle = attraction["subtitle"] as! String 
        let annotation = HumanAnnotation(coordinate: coordinate, title: title, subtitle: subtitle, type: type) 
        mapView.addAnnotation(annotation) 
       } 
      } 
} 

Вот скриншот PLIST: enter image description here Если вам нужен дополнительный код, чтобы понять, что происходит, пожалуйста, не стесняйтесь обращаться к нам и спасибо за помощь чьей заранее.

+1

Почему вы используете ' NSDictionary'? Используйте словарь Swift. – rmaddy

+0

@rmaddy Я действительно рассматривал его, и, как вы знаете, он запрашивает типы, которые войдут в словарь, который будет объявлен, но когда я попробовал типы строк или даже любые типы, это дало мне дополнительные ошибки. –

+2

Вы уверены, что корневой объект plist - это словарь? Вы используете перечислитель массива. – vadian

ответ

1

Я не уверен, ваш последний комментарий означает, что вы успешно преобразовали свой код, но, видя ваш образ PLIST, код может быть переписан так:

if 
     let filePath = Bundle.main.path(forResource: "GeorgiaHumanAnnotations", ofType: "plist"), 
     let dictArray = NSArray(contentsOfFile: filePath) as? [[String: Any]] 
    { 
     for attraction in dictArray { 
      let point = CGPointFromString(attraction["location"] as! String) 
      let coordinate = CLLocationCoordinate2DMake(CLLocationDegrees(point.x), CLLocationDegrees(point.y)) 
      let title = attraction["name"] as! String 
      let typeRawValue = Int((attraction["type"] as! String))! 
      let type = HumanAnnotationType(rawValue: typeRawValue)! 
      let subtitle = attraction["subtitle"] as! String 
      let annotation = HumanAnnotation(coordinate: coordinate, title: title, subtitle: subtitle, type: type) 
      mapView.addAnnotation(annotation) 
     } 
    } 
Смежные вопросы