web-dev-qa-db-fra.com

Référence ambiguë au membre 'joinWithSeparator' dans swift

J'utilise "reverseGeocodeCoordinate" de Google pour obtenir une adresse basée sur la latitude et la longitude.
J'obtiens l'erreur suivante dans l'implémentation

Référence ambiguë au membre "joinWithSeparator"

Voici ma mise en œuvre:

let aGMSGeocoder: GMSGeocoder = GMSGeocoder()
aGMSGeocoder.reverseGeocodeCoordinate(CLLocationCoordinate2DMake(17.45134626, 78.39304448)) {
    (let gmsReverseGeocodeResponse: GMSReverseGeocodeResponse!, let error: NSError!) -> Void in

    let gmsAddress: GMSAddress = gmsReverseGeocodeResponse.firstResult()
    print("lines=\(gmsAddress.lines)")
    let addressString = gmsAddress.lines.joinWithSeparator("")
    print("addressString=\(addressString)")

}

J'essaie de créer un addressString avec les éléments du tableau 'gmsAddress.lines ', mais se retrouve avec un message d'erreur.

Implémentation d'un exemple d'extrait pour tester 'joinWithSeparator'

let sampleArray = ["1", "2", "3", "4", "5"]
let joinedString = sampleArray.joinWithSeparator("")
print("joinedString=\(joinedString)")

Cela a réussi.
Ce que j'observe, "sampleArray" est un tableau d'éléments de type String, mais "gmsAddress.lines 'est un tableau d'éléments de type' AnyObject ', trouvé dans la bibliothèque' GMSAddress ':

/** An array of NSString containing formatted lines of the address. May be nil. */
public var lines: [AnyObject]! { get }

Alors, quelles sont les façons possibles d'atteindre la ligne suivante sans boucler le tableau:

let addressString = gmsAddress.lines.joinWithSeparator("")
23
Ashok

Il est ambigu car le tableau peut contenir AnyObject ce qui signifie que chaque objet du tableau pourrait être d'un type différent. Par conséquent, le compilateur ne peut pas savoir à l'avance si deux objets du tableau peuvent être joints.

La raison pour laquelle votre sampleArray fonctionne est qu'il a été implicitement déterminé comme étant un tableau de chaînes.

Si vous savez pertinemment que chaque élément du tableau lines est une chaîne, vous pouvez le forcer à le convertir en un tableau de chaînes:

let addressString = (gmsAddress.lines as! [String]).joinWithSeparator("")

Bien que cela vaut probablement la peine d'être prudent à ce sujet et de vérifier d'abord.

if let lines = gmsAddress.lines as? [String] {
    let addressString = lines.joinWithSeparator(", ")

    ...
}
25
Steve Wilford