Ответ 1
Безопасный способ достижения этого без использования типов Foundation - это использовать двойной инициализатор:
if let lat = latitude, let doubleLat = Double(lat) {
print(doubleLat) // doubleLat is of type Double now
}
У меня есть строка опций и вы хотите преобразовать ее в double.
это работало в Swift 2, но после преобразования в Swift 3, я получаю значение 0.
var dLati = 0.0
dLati = (latitude as NSString).doubleValue
У меня есть проверка и широта имеет необязательное строковое значение чего-то вроде -80.234543218675654, но значение dLati равно 0
*************** ОК, новое обновление для ясности *****************
У меня есть 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
}
.
.
}
Спасибо Борна
Безопасный способ достижения этого без использования типов Foundation - это использовать двойной инициализатор:
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)!
}
Когда вы получаете строку с двойным значением, что-то вроде этого
"Optional(12.34567)"
Вы можете использовать Regex, который выдает двойное значение из строки.
Это пример кода для Regex, если строка "Optional(12.34567)"
:
let doubleLatitude = location.latitude?.replacingOccurrences(of: "[^\\.\\d+]", with: "", options: [.regularExpression])
Вы можете сделать это просто в одной строке.
var latitude: Double = Double("-80.234543218675654") ?? 0.0
Это создает переменную с именем широта, которая имеет тип Double, которая либо создается с успешным Double from String, либо получает значение возврата 0.0
Не конвертируйте его в 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
Update:
Для обработки значений 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")
}
На самом деле слово optional было частью строки. Не знаете, как это было добавлено в строку? Но так, как я это сделал, это было так. широта была эта строка "Необязательно (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
В swift 3.1 мы можем комбинировать расширения и Concrete Constrained Extensions
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
}
}
Swift 4
let YourStringValue1st = "33.733322342342" //The value is now in string
let YourStringValue2nd = "73.449384384334" //The value is now in string
//MARK:- For Testing two Parameters
if let templatitude = (YourStringValue1st as? String), let templongitude = (YourStringValue2nd as? String)
{
movetosaidlocation(latitude: Double(templat)!, longitude: Double(templong)!, vformap: cell.vformap)
}
let YourStringValue = "33.733322342342" //The value is now in string
//MARK:- For Testing One Value
if let tempLat = (YourStringValue as? String)
{
let doublevlue = Double(tempLat)
//The Value is now in double (doublevlue)
}