Подтвердить что ты не робот

Неоднозначная ссылка на членство "joinWithSeparator" в быстрой

Я использую Google reverseGeocodeCoordinate, чтобы получить адрес, основанный на широте и долготе.
Я получаю следующую ошибку в реализации

Неоднозначная ссылка на элемент joinWithSeparator

Ниже приведена моя реализация:

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

}

Я пытаюсь создать addressString с элементами в массиве gmsAddress.lines ', но в итоге появляется сообщение об ошибке.

Реализован фрагмент образца для тестирования 'joinWithSeparator'

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

Это удалось.
Что я наблюдаю, "sampleArray" - это массив элементов типа String, но "gmsAddress.lines" - это массив элементов типа "AnyObject", найденный в библиотеке "GMSAddress":

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

Итак, Каковы возможные способы достижения следующей строки без цикла массива:

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

Ответ 1

Это неоднозначно, потому что массив может содержать AnyObject, что означает, что каждый объект в массиве может быть другого типа. Поэтому компилятор не может заранее знать, могут ли быть объединены любые два объекта в массиве.

Причина, по которой работает ваш sampleArray, заключается в том, что он неявно определяется как массив строк.

Если вы знаете, что каждый элемент в массиве lines представляет собой строку, вы можете заставить ее перетащить в массив строк:

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

Хотя, вероятно, стоит быть уверенным в этом и сначала проверять.

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

    ...
}