MKMapItem placemark is unavailable in swift

ios, mapkit, swift

Solution

The `response.mapItems` array is declared in the API as of type `[AnyObject]!`.

The `for` loop isn't explicitly saying that `res` is of type `MKMapItem` (or that `response.mapItems` is actually `[MKMapItem]`).

So `res` is treated like an instance of `AnyObject` which isn't defined as having a `placemark` property.

This is why you get the compiler error `'placemark' is unavailable...`.

To fix this, cast `res` as an `MKMapItem` and then the `placemark` property will become visible.

Example:

for res in response.mapItems {
    if let mi = res as? MKMapItem {
        self.userSearch.append(mi.placemark)
    }
}

Also, this line after the `for` loop:

self.userSearch = response.mapItems.placemark

doesn't make sense if `userSearch` is supposed to be an array of placemarks. The `for` loop is appending placemarks to that array and then this line is setting the array to a single placemark object (in addition, the `mapItems` object doesn't even have a `placemark` property).

This line should most likely be removed.

Problem

I am currently trying to make a searchbar that autopopulates with locations as the user types. I am using a MKLocalSearch to get a MKLocalSearchResponse and it appears to return values I can use. However to get the name, address or coordinates out of the search needs access to the MKPlacemark property in the search response. When I access the placemark I get the error: 'placemark' is unavailable: APIs deprecated as of iOS7 and earlier are unavailable in Swift ``` var request = MKLocalSearchRequest() request.naturalLanguageQuery = searchText //PUT HERE: check if network is on? let localSearch: MKLocalSearch = MKLocalSearch(request: request) localSearch.startWithCompletionHandler { (response: MKLocalSearchResponse!, error: NSError!) -> Void in if (error == nil) { println("searched") for res in response.mapItems { self.userSearch.append(res.placemark) } self.userSearch = response.mapItems.placemark self.tableView?.reloadData() } else { println(error) } } } ``` Does anyone know a workaround to accessing the placemark? Thanks!

Original source