我正在使用Google的“reverseGeocodeCoordinate”来获取基于纬度和经度的地址。
我在实现中遇到以下错误



下面是我的实现:

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

最佳答案

这是模棱两可的,因为数组可以包含AnyObject,这意味着数组中的每个对象都可以具有不同的类型。因此,编译器无法事先知道数组中是否可以连接任何两个对象。

您的sampleArray起作用的原因是它被隐式确定为字符串数组。

如果您知道lines数组中的每个元素都是一个字符串的事实,则可以强制将其向下转换为字符串数组:

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

尽管对此进行安全检查并首先检查是值得的。
if let lines = gmsAddress.lines as? [String] {
    let addressString = lines.joinWithSeparator(", ")

    ...
}

10-08 05:42