J'ai une chaîne d'option et je veux la convertir en double.
Cela a fonctionné dans Swift 2, mais depuis que je suis converti en Swift 3, la valeur de 0 s’élève à 0.
var dLati = 0.0
dLati = (latitude as NSString).doubleValue
J'ai check et latitude a une valeur de chaîne optionnelle de quelque chose comme -80.234543218675654, mais la valeur dLati est 0
*************** ok, nouvelle mise à jour pour plus de clarté *****************
J'ai un contrôleur de vue pour lequel j'ai un bouton, et lorsque le bouton est touché, il appelle un autre contrôleur de vue et lui transmet quelques valeurs il y a le code pour le premier contrôleur de vue
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
}
}
Voici le code du second contrôleur de vue appelé 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
}
.
.
}
Merci Borna
Un moyen sûr d'y parvenir sans avoir à utiliser les types Foundation consiste à utiliser l'initialiseur de Double:
if let lat = latitude, let doubleLat = Double(lat) {
print(doubleLat) // doubleLat is of type Double now
}
Décompressez la valeur latitude
en toute sécurité, puis utilisez
var dLati = 0.0
if let lat = latitude {
dLati = (lat as NSString).doubleValue
}
let dLati = Double(latitude ?? "") ?? 0.0
Ce code fonctionne bien.
var dLati = 0.0
let latitude: String? = "-80.234543218675654"
if let strLat = latitude {
dLati = Double(strLat)!
}
Lorsque vous obtenez une chaîne à double valeur, quelque chose comme ceci
"Optional(12.34567)"
Vous pouvez utiliser une expression régulière qui extrait la valeur double de la chaîne . Il s'agit de l'exemple de code pour une expression régulière si la chaîne est "Optional(12.34567)"
:
let doubleLatitude = location.latitude?.replacingOccurrences(of: "[^\\.\\d+]", with: "", options: [.regularExpression])
Vous pouvez le faire simplement en une seule ligne.
var latitude: Double = Double("-80.234543218675654") ?? 0.0
Cela crée une variable nommée latitude de type Double qui est soit instanciée avec un double réussi de chaîne, soit reçoit une valeur de repli de 0.0
Ne le convertissez pas en un NSString
, vous pouvez le forcer pour un Double
mais avoir un repli en cas d'échec. Quelque chose comme ça:
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
Donc dans votre cas:
dLati = Double(latitude!) ?? 0.0
Mise à jour: Pour gérer les valeurs nil
, procédez comme suit (notez que cLat est 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")
}
Dans Swift 3.1 , nous pouvons combiner des extensions et des extensions en béton contraint.
extension Optional where Wrapped == String
{
var asDouble: Double
{
return NSString(string: self ?? "").doubleValue
}
}
Ou
extension Optional where Wrapped == String
{
var asDouble: Double
{
return Double(str ?? "0.00") ?? 0.0
}
}
En fait, le mot facultatif faisait partie de la chaîne. Vous ne savez pas comment cela a été ajouté dans la chaîne? Mais la façon dont j'ai résolu le problème était comme ça. latitude était cette chaîne "Optionnel (26.33691567239162)" alors j'ai fait ce code
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)
et a cela comme valeur finale
26.33691567239162