Я пытаюсь быстро написать функцию, которая создает MKMapItem, но получаю ошибку String. Вот код:

func mapItem() -> MKMapItem {
    let addressDictionary = [String(kABPersonAddressStreetKey): subtitle]
    let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)

    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = title

    return mapItem
}

При попытке создать placemark возникает следующая ошибка:

Не удается преобразовать значение типа «[String: String?]» В ожидаемый тип аргумента «[String: AnyObject]?

Полный код класса:

class Bar: NSObject, MKAnnotation {

    // MARK: Properties
    let id: Int
    let title: String
    let locationName: String
    let url: String
    let imageUrl: String
    let tags: String
    let coordinate: CLLocationCoordinate2D

    // MARK: Initialisation
    init(id: Int, adress: String, name: String, url: String, tags: String, imageUrl: String, coordinate: CLLocationCoordinate2D) {
        // Affectation des attributs
        self.id = id
        self.title = name
        self.locationName = adress
        self.url = url
        self.imageUrl = imageUrl
        self.tags = tags
        self.coordinate = coordinate
    }

    // MARK: Subtitle

    var subtitle: String {
        return locationName
    }

    // MARK: Helper

    func mapItem() -> MKMapItem {
        var addressDictionary : [String:String]?
        addressDictionary = [String(kABPersonAddressStreetKey): subtitle]

        let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)

        let mapItem = MKMapItem(placemark: placemark)
        mapItem.name = title

        return mapItem
    }    
}
3
Kishlin 18 Апр 2016 в 17:22

2 ответа

Лучший ответ

Замените эту строку:

  let title: String?

Заменить этот код:

 var subtitle: String? {
        return locationName
    }

Вам необходимо преобразовать свои субтитры как AnyObject, как показано ниже:

let addressDict = [String(kABPersonAddressStreetKey): self.subtitle as! AnyObject]

И ваш полный код для "func mapItem () -> MKMapItem {}" будет:

func mapItem() -> MKMapItem {
    let addressDict = [String(kABPersonAddressStreetKey): self.subtitle as! AnyObject]
    let placemark = MKPlacemark(coordinate: self.coordinate, addressDictionary: addressDict)

    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = self.title

    return mapItem
  }
3
Nilesh 4 Июл 2016 в 11:31

Свойство субтитров выглядит как необязательная строка, но инициализатору MKPlacemark требуется аргумент типа [String : AnyObject]? для addressDictionary.

Что это значит ?

Ожидаемый тип аргумента - это словарь, где ключом является String, а значение имеет вид AnyObject, поэтому это может быть что угодно. Все, кроме нулевого значения! Но ваше свойство subtitle может быть нулевым, поэтому у вас есть эта ошибка.

Разверните свое значение перед его использованием:

func mapItem() -> MKMapItem {

    var addressDictionary : [String:String]?

    if let subtitle = subtitle {
        // The subtitle value used here is a String,
        // so addressDictionary conforms to its [String:String] type
        addressDictionary = [String(kABPersonAddressStreetKey): subtitle
    }

    let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)

    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = title
    return mapItem
}

Вы также можете вернуть необязательные объекты MKMapItem, если subtitle равно нулю. Выбор за вами ;)

1
Michaël Azevedo 18 Апр 2016 в 14:43