Невозможно добавить значение типа «[NSObject: AnyObject]» с индексом типа «String». - PullRequest
0 голосов
/ 02 мая 2018

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

Невозможно добавить значение типа «[NSObject: AnyObject]» с индексом типа «String»

Вот код во всей красе:

import Foundation
import MapKit

enum LocationKey: String {
    case Latitude = "lat"
    case Longitude = "long"
    case Title = "title"
}

extension MKPointAnnotation {
    var propertyState: [NSObject: AnyObject] {
        get {
            return [ LocationKey.Longitude.rawValue as NSObject: NSNumber(value: coordinate.latitude),
                     LocationKey.Longitude.rawValue as NSObject: NSNumber(value: coordinate.longitude),
                     LocationKey.Title.rawValue as NSObject: title as AnyObject]
        }
        set {
            let lat = (newValue[LocationKey.Latitude.rawValue] as NSNumber).doubleValue
            let long = (newValue[LocationKey.Longitude.rawValue] as NSNumber).doubleValue
            coordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
            title = newValue[LocationKey.Title.rawValue] as NSString
        }
    }
}

Строки кода, с которыми у меня действительно возникают проблемы:

let lat = (newValue[LocationKey.Latitude.rawValue] as NSNumber).doubleValue
let long = (newValue[LocationKey.Longitude.rawValue] as NSNumber).doubleValue
title = newValue[LocationKey.Title.rawValue] as NSString

Спасибо большое!

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Это потому, что вы создаете словарь с ключом NSObject.

Попробуйте это:

import Foundation
import MapKit

enum LocationKey: String {
    case Latitude = "lat"
    case Longitude = "long"
    case Title = "title"
}

extension MKPointAnnotation {
    var propertyState: [String: AnyObject] {
        get {
            return [ LocationKey.Longitude.rawValue: NSNumber(value: coordinate.latitude),
                     LocationKey.Longitude.rawValue: NSNumber(value: coordinate.longitude),
                     LocationKey.Title.rawValue: title as AnyObject]
        }
        set {
            guard let lat = (newValue[LocationKey.Latitude.rawValue] as? NSNumber)?.doubleValue,
                let long = (newValue[LocationKey.Longitude.rawValue] as? NSNumber)?.doubleValue else {
                return
            }
            coordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
            title = newValue[LocationKey.Title.rawValue] as? String
        }
    }
}

В коде, который вы видели, традиционно разворачивается опционально в properyState установщике, потому что это хорошая практика - не использовать принудительное развертывание.

0 голосов
/ 02 мая 2018

Ваш код слишком сложный. Все значения относятся к типу значений, поэтому объявите словарь как [String:Any], что, кстати, устраняет ошибку, и избавьтесь от всех уродливых приведений типов к NSNumber и AnyObject.

.
import Foundation
import MapKit

enum LocationKey: String {
    case latitude = "lat"
    case longitude = "long"
    case title = "title"
}


extension MKPointAnnotation {
    var propertyState: [String: Any] {
        get {
            return [ LocationKey.latitude.rawValue: coordinate.latitude,
                     LocationKey.longitude.rawValue: coordinate.longitude,
                     LocationKey.title.rawValue: title ?? ""]
        }
        set {
            guard let lat = newValue[LocationKey.latitude.rawValue] as? CLLocationDegrees,
            let long = newValue[LocationKey.longitude.rawValue] as? CLLocationDegrees else { return }
            coordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
            title = newValue[LocationKey.title.rawValue] as? String
        }
    }
}

Вы даже можете использовать enum в качестве ключа

extension MKPointAnnotation {
    var propertyState: [LocationKey: Any] {
        get {
            return [ .latitude: coordinate.latitude,
                     .longitude: coordinate.longitude,
                     .title: title ?? ""]
        }
        set {
            guard let lat = newValue[.latitude] as? CLLocationDegrees,
            let long = newValue[.longitude] as? CLLocationDegrees else { return }
            coordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)
            title = newValue[.title] as? String
        }
    }
}

Примечание. Ваш геттер дважды использует LocationKey.Longitude, что приведет к ошибке компиляции.

0 голосов
/ 02 мая 2018

var propertyState: [NSObject: AnyObject] - это словарь, имеющий ключи типа NSObject. Попробуйте изменить это на String и посмотрите, сработает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...