Ошибка типа аргумента на MKPlacemark
Я пытаюсь написать в swift функцию, которая создает MKMapItem, но я получаю строковую ошибку. Вот код:
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
}
}
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
}
Ваше свойство субтитров выглядит как необязательная строка, но 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
ноль Выбор за вами;)