2016-04-18 4 views
3

Ich versuche in Swift eine Funktion zu schreiben, die ein MKMapItem erstellen, aber ich erhalte einen String-Fehler. Hier ist der Code:Argumenttyp Fehler auf MKPlacemark

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 
} 

Ich habe die folgende Fehlermeldung, wenn ich versuche placemark zu erstellen:

Kann nicht konvertieren Wert vom Typ „[Zeichenfolge: Zeichenfolge]“ zu erwarten Argument Typ „[Zeichenfolge : ANYOBJECT]

Vollklassencode:

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 
    }  
} 

Antwort

1

diese Zeichenfolge ersetzen:

let title: String? 

diesen Code ersetzen:

var subtitle: String? { 
     return locationName 
    } 

Sie benötigen Untertitel als ANYOBJECT zu werfen, wie unten dargestellt:

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

und Ihr vollständiger Code für "func mapItem() -> MKMapItem {}" lautet:

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 
    } 
1

Ihre Untertiteleigenschaft sieht wie ein optionaler String aus, aber MKPlacemark Initialisierer benötigt ein Argument vom Typ [String : AnyObject]? für addressDictionary.

Was bedeutet das?

Der erwartete Argumenttyp ist ein Wörterbuch, in dem der Schlüssel ein String und der Wert von Art AnyObject ist, so kann es alles sein. Alles außer dem Nullwert! Aber Ihre subtitle Eigenschaft kann Null sein, daher haben Sie diesen Fehler.

Abwickelwerkzeug Ihren Wert, bevor es mit:

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 
} 

Sie können auch eine optionale MKMapItem Objekte zurück, wenn subtitle Null ist. Die Wahl liegt bei Ihnen;)

+0

Danke für die Antwort! Tho, als ich versuchte, gab er mir einen Fehler auf die Untertitel Untertitel = "Bound-Wert in einer bedingten Bindung muss optionalen Typ sein", so habe ich nur die If-Bedingung entfernt und es hat alles gut funktioniert. – Kishlin

+0

Der vorherige Fehler sah aus, als wäre Untertitel unoptionsmäßig, aber vielleicht ist es ein implizites, nicht eingepacktes, optionales. Aus Neugier, was ist die Erklärung dieser Variable? Wie auch immer, ich bin froh zu wissen, dass du dein Problem gelöst hast :) –

+0

Ich habe den vollständigen Klassencode in meinem ersten Beitrag hinzugefügt. – Kishlin

Verwandte Themen