swift中对成员“joinWithSeparator”的模糊引用

Posted

技术标签:

【中文标题】swift中对成员“joinWithSeparator”的模糊引用【英文标题】:Ambiguous reference to member 'joinWithSeparator' in swift 【发布时间】:2016-01-01 23:54:51 【问题描述】:

我正在使用 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)")


我正在尝试使用数组“gmsAddress.lines”中的元素创建一个addressString,但最终得到一条错误消息。

实现了一些示例 sn-p 来测试“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("")

【问题讨论】:

【参考方案1】:

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

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

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

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

虽然这可能值得安全并首先检查。

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

    ...

【讨论】:

以上是关于swift中对成员“joinWithSeparator”的模糊引用的主要内容,如果未能解决你的问题,请参考以下文章

xcode 8 swift 3 中多点连接框架中对成员“会话(_:peer:didChange)”错误的模糊引用

在 Swift 中对协议数组进行排序?

如何在 Swift 中对字符串进行切片? [复制]

如何在 Swift 中对 NSDate 进行排序

如何在 Swift 中对字体进行样式化?

如何在 Swift 中对对象数组进行排序?