在Swift 3中将可选string转换为double
我有一个选项string,并希望将其转换为双倍。
这工作在Swift 2,但自从转换到Swift 3,我得到0的价值。
var dLati = 0.0 dLati = (latitude as NSString).doubleValue
我有检查和纬度有一个像-80.234543218675654类似的可选string值,但dLati值是0
***************好的,新的更新清晰*****************
我有一个viewcontroller,我有一个button,当button被触摸,它会调用另一个viewcontroller并传递一些值,这里是第一个viewcontroller的代码
var currentLatitude: String? = "" var currentLongitude: String? = "" var deviceName = "" var address = "" // somewhere in the code, currentLatitude and currentLongitude are get set override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "map" { let destViewController : MapViewController = segue.destination as! MapViewController print(currentLongitude!) // Print display: Optional(-80.192279355363768) print(currentLatitude!) // Print display: Optional(25.55692663937162) destViewController.longitude = currentLongitude! destViewController.latitude = currentLatitude! destViewController.deviceName = deviceName destViewController.address = address } }
以下是称为MapViewController的第二个视图控制器的代码
var longitude: String? = " " var latitude: String? = "" . . override func viewDidLoad() { if let lat = latitude { print(lat) // Print display: optiona(25.55692663937162) dLati = (lat as NSString).doubleValue print(dLati) // Print display: 0.0 } . . }
感谢Borna
一个安全的方法来实现这一点,而不需要使用基础types是使用Double的初始值设定项:
if let lat = latitude, let doubleLat = Double(lat) { print(doubleLat) // doubleLat is of type Double now }
打开latitude
值,然后使用
var dLati = 0.0 if let lat = latitude { dLati = (lat as NSString).doubleValue }
let dLati = Double(latitude ?? "") ?? 0.0
这段代码工作正常。
var dLati = 0.0 let latitude: String? = "-80.234543218675654" if let strLat = latitude { dLati = Double(strLat)! }
当你得到一个像这样的double值的string
"Optional(12.34567)"
您可以使用从string中取出double值的正则expression式。 这是正则expression式的示例代码,如果string是"Optional(12.34567)"
:
let doubleLatitude = location.latitude?.replacingOccurrences(of: "[^\\.\\d+]", with: "", options: [.regularExpression])
其实可选字是string的一部分。 不知道它是如何被添加到string中? 但我固定它的方式就是这样。 纬度是这个string“可选(26.33691567239162)”然后我做了这个代码
let start = latitude.index(latitude.startIndex, offsetBy: 9) let end = latitude.index(latitude.endIndex, offsetBy: -1) let range = start..<end latitude = latitude.substring(with: range)
并把它作为最终的价值
26.33691567239162
不要把它转换成NSString
,你可以强制它成为一个Double
但是如果失败的话有一个回退。 像这样的东西:
let aLat: String? = "11.123456" let bLat: String? = "11" let cLat: String? = nil let a = Double(aLat!) ?? 0.0 // 11.123456 let b = Double(bLat!) ?? 0.0 // 11 let c = Double(cLat!) ?? 0.0 // 0
所以在你的情况下:
dLati = Double(latitude!) ?? 0.0
更新:处理nil
值做以下(注意,让cLat是nil
:
// Will succeed if let a = aLat, let aD = Double(aLat!) { print(aD) } else { print("failed") } // Will succeed if let b = bLat, let bD = Double(bLat!) { print(bD) } else { print("failed") } // Will fail if let c = cLat, let cD = Double(cLat!) { print(cD) } else { print("failed") }
在swift 3.1中 ,我们可以将扩展和具体的约束扩展结合起来
extension Optional where Wrapped == String { var asDouble: Double { return NSString(string: self ?? "").doubleValue } }
要么
extension Optional where Wrapped == String { var asDouble: Double { return Double(str ?? "0.00") ?? 0.0 } }
你可以简单地在一行中做到这一点。
var latitude: Double = Double("-80.234543218675654") ?? 0.0
这将创build一个名为latitude的variables,该variables的types为Double,该variables或者通过Double的成功实例化,或者被赋予一个回退值0.0