"kABPersonAddressStreetKey" устарел в iOS 9.0: используйте CNPostalAddress.street

У меня есть следующий класс, написанный в более ранней версии Swift. Компилятор Swift 2 предупреждает, что

' kABPersonAddressStreetKey' устарел в iOS 9.0: используйте CNPostalAddress.street

и дает ошибку

'Невозможно найти инициализатор для типа "MKPlacemark", который принимает список аргументов типа '(координата: CLLocationCoordinate2D, addressDictionary: [String: String?]) '

Я понимаю, что для устранения ошибки необходимы дополнительные опции, но все, что я пытаюсь, похоже, не решает проблему. Это связано с тем, что я был новичком, и любая помощь была бы оценена.

import Foundation
import MapKit
import AddressBook

class Artwork: NSObject, MKAnnotation {
let title: String?
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D

init(title: String, locationName: String, discipline: String, coordinate: CLLocationCoordinate2D) {
    self.title = title
    self.locationName = locationName
    self.discipline = discipline
    self.coordinate = coordinate

    super.init()
}

var subtitle: String? {
    return locationName
}

// annotation callout info button opens this mapItem in Maps app
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
  }
}

Ответы

Ответ 1

Замените import AddressBook на import Contacts, а также замените String(kABPersonAddressStreetKey) на String(CNPostalAddressStreetKey)

import Foundation
import MapKit
import Contacts

class Artwork: NSObject, MKAnnotation {
let title: String?
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D

init(title: String, locationName: String, discipline: String,       coordinate: CLLocationCoordinate2D) {
    self.title = title
    self.locationName = locationName
    self.discipline = discipline
    self.coordinate = coordinate

    super.init()
}

var subtitle: String? {
    return locationName
}

// annotation callout info button opens this mapItem in Maps app
func mapItem() -> MKMapItem {
    let addressDictionary = [String(CNPostalAddressStreetKey): self.subtitle!]
    let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)
    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = title

    return mapItem

}

Ответ 2

Вы должны использовать:

  • import Contacts вместо import AddressBook.
  • CNPostalAddressStreetKey вместо kABPersonAddressStreetKey.

Ответ 3

Подал на него радар. Получил этот ответ сегодня:

Инженерия предоставила следующую информацию по этому вопросу: Пожалуйста, знайте, что вы должны продолжать использовать устаревшие ключи.

Ответ 4

Вам нужно передать свои субтитры как 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
  }