首页 > 解决方案 > 快速将字符串数组转换为 Double

问题描述

我正在尝试将字符串快速转换为双精度。我设法将字符串从网站(www.x-rates.com)提取到一个数组中,但我无法在双精度后将其转换为围绕这个数字做一些工作。谁能告诉我我应该做什么或我做错了什么?我知道我的标签现在没有更新,但我稍后会更新,我要做的第一件事就是转换。多谢!

这是代码:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var resultLabel: UILabel!        
    @IBOutlet weak var moneyTextField: UITextField!        
    @IBAction func convert(_ sender: Any) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


        let url = URL(string: "https://www.x-rates.com/calculator/?from=EUR&to=USD&amount=1")!

        let request = NSMutableURLRequest(url : url) 
        let task = URLSession.shared.dataTask(with: request as URLRequest) {
        data, response, error in

            var message = ""

            if let error = error {

                print(error)
            } else {

                if let unwrappedData = data {

                    let dataString = NSString(data: unwrappedData, encoding: String.Encoding.utf8.rawValue)

                    var stringSeperator = "<span class=\"ccOutputRslt\">"

                    if let contentArray = dataString?.components(separatedBy: stringSeperator){
                        if contentArray.count > 0 {
                            stringSeperator = "<span"

                           let newContentArray = contentArray[1].components(separatedBy: stringSeperator)

                            if newContentArray.count > 0 {

                                message = newContentArray[0]

                                var message = Float(newContentArray[0])! + 10

                                }                                   
                            }
                        }
                    }
                }

            DispatchQueue.main.sync(execute: {
                self.resultLabel.text = "the value of the dollar is " + message

            }           
        )}
        task.resume()


        func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

标签: arraysswift

解决方案


我将讨论将Arrayof转换StringArrayof Double

在 swiftArray中有一个名为 的方法map,它负责映射数组中的值,例如,在 map 函数中,您将收到一个指向您的数组的对象,这会将这个对象转换为您的新数组 ex。

let arrOfStrings = ["0.3", "0.4", "0.6"];

let arrOfDoubles = arrOfStrings.map { (value) -> Double in
    return Double(value)!
}

结果将是返回示例

更新:

@LeoDabus 评论了一个重要提示,这个例子正在考虑一个完美的数据源,但是如果你有一个动态源,你可以把?它放在 return 上,它会工作,但这将返回一个数组nil

像那样

let arrOfStrings = ["0.3", "0.4", "0.6", "a"];

let arrOfDoubles = arrOfStrings.map { (value) -> Double? in
    return Double(value)
}

看这个,返回数组有一个nil元素

第二个例子

如果您使用@LeoDabus 的提示,您将保护这种情况,但您需要了解您的问题需要什么才能在map或之间选择更好的选择compactMap

例如compactMap

let arrOfStrings = ["0.3", "0.4", "0.6", "a"];

let arrOfDoubles = arrOfStrings.compactMap { (value) -> Double? in
    return Double(value)
}

看结果

compactMap 示例结果

更新:

在与问题的作者(@davidandersson)交谈后,这个带有 map ou contactMap 的解决方案不是他的问题,我对他的代码进行了修改并且效果很好。

首先我替换了var message = "" per var rateValue:Double = 0.0 and replacedFloat toDouble`

看最终代码

让 url = URL(字符串:“ https://www.x-rates.com/calculator/?from=EUR&to=USD&amount=1 ”)!

    let request = NSMutableURLRequest(url : url)
    let task = URLSession.shared.dataTask(with: request as URLRequest) {
        data, response, error in
        var rateValue:Double = 0.0;
        if let error = error {
            print(error)
        } else {
            if let unwrappedData = data {
                let dataString = NSString(data: unwrappedData, encoding: String.Encoding.utf8.rawValue)
                var stringSeperator = "<span class=\"ccOutputRslt\">"
                if let contentArray = dataString?.components(separatedBy: stringSeperator){
                    if contentArray.count > 0 {
                        stringSeperator = "<span"
                        let newContentArray = contentArray[1].components(separatedBy: stringSeperator)
                        if newContentArray.count > 0 {
                            rateValue = Double(newContentArray[0])! + 10
                        }
                    }
                }
            }
        }
        //
        print("Rate is \(rateValue)"); //Rate is 11.167
    }
    task.resume()

希望能帮到你


推荐阅读