2015-10-05 11 views
23

Ich verwende Googles 'reverseGeocodeCoordinate', um Adresse basierend auf Breite und Länge zu erhalten.
Ich erhalte den folgenden Fehler in der ImplementierungMehrdeutiger Verweis auf Mitglied 'joinWithSeparator' in swift

Mehrdeutige Bezug auf User ist 'joinWithSeparator'

Im Folgenden meine Implementierung:

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)") 

} 

Ich versuche, eine zu schaffen addressString mit den Elementen im Array 'gmsAddress.lines', aber am Ende mit einer Fehlermeldung.

einige Beispiel-Code-Schnipsel implementiert 'joinWithSeparator' zu testen

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

Es gelang.
Was ich beobachte ist, 'sampleArray' eine Reihe von Elementen des Typs ist String, aber 'gmsAddress.lines' ist ein Array von Elementen des Typs 'AnyObject', gefunden in 'GMSAddress' Bibliothek:

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

So, welche Möglichkeiten geben die folgende Zeile zu erreichen, ohne das Array Looping:

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

Antwort

25

Es ist nicht eindeutig, da das Array AnyObject Bedeutung jedes Objekt im Array enthalten kann von einem anderen Typ sein könnte. Daher kann der Compiler nicht im Voraus wissen, ob zwei beliebige Objekte in dem Array verbunden werden können.

Der Grund, warum Ihre sampleArray funktioniert, ist, dass es implizit als ein Array von Zeichenfolgen bestimmt wurde.

Wenn Sie für eine Tatsache wissen, dass jedes Element in der lines Array ist eine Zeichenfolge, die Sie zwingen kann gesenkten auf ein Array von Strings:

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

Obwohl es wahrscheinlich lohnt, darüber zu sein sicher und überprüft zuerst.

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

    ... 
}