Swift中String转double失败:创建CLLocationObject遇0.0值问题
解决String转Double为0.0的问题
嘿,我来帮你搞定这个问题!从你打印的结果some("Optional(52.523553)")就能看出问题所在:你的cityObject.lat其实是两层嵌套的可选值——外层是Optional<String>,而内层的字符串本身又是把一个Optional<Double>直接转成String的结果(比如你之前可能直接打印了可选的Double,导致它变成了"Optional(xxx)"这种格式的字符串)。
之前的代码(cityObject.lat as! NSString).doubleValue会失败有两个原因:
- 强制解包
cityObject.lat如果是nil会直接崩溃,非常不安全; - 当字符串是
"Optional(52.523553)"时,NSString的doubleValue无法识别这种格式,转换失败就会返回默认值0.0。
解决步骤和代码示例
我们需要先清理字符串格式,再安全转换:
1. 直接处理的写法
// 处理纬度 if let latString = cityObject.lat, // 先安全解包外层的可选字符串 // 清理掉字符串里的"Optional("和")",同时去掉多余空格 let cleanedLat = latString.replacingOccurrences(of: "Optional(", with: "") .replacingOccurrences(of: ")", with: "") .trimmingCharacters(in: .whitespacesAndNewlines), // 把清理后的字符串转成Double let latDouble = Double(cleanedLat) { // 这里就可以用latDouble创建CLLocation了 let location = CLLocation(latitude: latDouble, longitude: ...) } else { // 处理转换失败的情况,比如给默认值或者提示错误 print("纬度转换失败,请检查数据格式") } // 同理处理经度 if let lonString = cityObject.lon, let cleanedLon = lonString.replacingOccurrences(of: "Optional(", with: "") .replacingOccurrences(of: ")", with: "") .trimmingCharacters(in: .whitespacesAndNewlines), let lonDouble = Double(cleanedLon) { // 使用lonDouble }
2. 封装成扩展方法(更优雅,方便复用)
如果需要多次处理这种格式的字符串,可以给String写个扩展:
extension String { /// 从包含Optional描述的字符串中提取Double值 func extractDouble() -> Double? { let cleaned = self.replacingOccurrences(of: "Optional(", with: "") .replacingOccurrences(of: ")", with: "") .trimmingCharacters(in: .whitespacesAndNewlines) return Double(cleaned) } } // 使用起来就很简洁: if let latString = cityObject.lat, let lat = latString.extractDouble() { print(lat) // 输出52.523553 } if let lonString = cityObject.lon, let lon = lonString.extractDouble() { print(lon) // 输出13.403783 }
额外建议
最好从源头避免这种嵌套的可选字符串格式。比如在获取或存储cityObject的经纬度时,直接存成Optional<Double>类型,而不是把可选Double转成String存储。这样后续使用时直接解包就能用,不需要额外的字符串清理步骤。
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

