【问题标题】:Cannot convert value of type '[String]' to type 'NSString' in coercion无法强制将“[String]”类型的值转换为“NSString”类型
【发布时间】:2021-03-08 03:54:34
【问题描述】:

我有一个输出字符串:

LATITUDE = [String]()
LATITUDE = ["41.87194", "33.4941704", "46.8796822", "31.9685988", "45.253783"]
var custlatt = (LATITUDE as NSString).doubleValue

我正在尝试将纬度坐标插入到下面的代码中:

var markerDict: [Int: GMSMarker] = [:]
for i in 0...(POST_COUNT - 1){
                markerDict[i] = GMSMarker()
                markerDict[i]?.position = CLLocationCoordinate2D(latitude:custlatt[i], longitude: custlong[i])
                markerDict[i]?.title = ""
                markerDict[i]?.icon = UIImage(named: "Pin Red Small")
                markerDict[i]?.snippet = ""
                markerDict[i]?.map = mapView

对于 var custlatt,我收到错误“无法将类型 '[String]' 的值转换为强制类型 'NSString'”

非常感谢任何帮助,我是 swift 新手,我已经被困了很长一段时间。提前致谢!

【问题讨论】:

  • 如果您不认识数组,那么我建议您暂时停止编码并阅读Swift Programming Langeuage 书籍的前 5 或 6 章,以便了解基础知识。跨度>

标签: arrays swift string


【解决方案1】:

您不能强制将数组转换为单个值。但是根据代码,这无论如何都不是你想要的。

转换为NSString 以将String 转换为Double 的桥是unswifty

将字符串数组转换为双精度值数组的原生 Swift 方法是

let stringLatitudes = ["41.87194", "33.4941704", "46.8796822", "31.9685988", "45.253783"]
let latitudes = stringLatitudes.compactMap(Double.init)

for 循环也是 objective-c-ish。在 Swift 中,有一个半开范围运算符 (..<),它避免了 -1 减法。

for i in 0..<postCount { ...

注意:请根据命名约定命名变量lowerCamelCase

【讨论】:

  • 请注意,有 2 个数组,还有从 0 到 postCount 的 for 循环,所以 compactMap 真的会搞砸
  • @JoakimDanielson 是的,但由于字符串数组似乎是文字,因此超出范围的崩溃将揭示设计错误。
  • @vadian 非常感谢您的回答,解决了这两个问题。我还在学习,我坚持了很长时间。再次感谢!
【解决方案2】:

您需要在 for 循环中进行转换,您不能将 Array&lt;String&gt; 转换为 NSString

此外,将String 转换为Double 不应通过NSString 完成,而应通过Double 初始化程序完成。

您还应该遵守 Swift 命名约定,变量名称为 lowerCamelCase。

let latitudes = ["41.87194", "33.4941704", "46.8796822", "31.9685988", "45.253783"].compactMap { Double($0) }
let longitudes = ["42", "33", "23", "45", "6"].compactMap { Double($0) } 

var markerDict: [Int: GMSMarker] = [:]
for i in 0..<postCount {
    let marker = GMSMarker()
    market = GMSMarker()
    marker.position = CLLocationCoordinate2D(latitude:latitudes[i], longitude: longitudes[i])
    marker.title = ""
    marker.icon = UIImage(named: "Pin Red Small")
    marker.snippet = ""
    marker.map = mapView
    markerDict[i] = marker
}

【讨论】:

  • 0..&lt;postCount - 1 应该是0..&lt;postCount
  • 查看我对 vadians 回答的评论,compactMap 在这里可能很危险。
猜你喜欢
  • 1970-01-01
  • 2019-02-03
  • 2019-01-10
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多