快速将字符串数组转换为Double

时间:2018-07-24 20:35:47

标签: arrays swift

我正在尝试将字符串快速转换为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.
    }
}

2 个答案:

答案 0 :(得分:1)

我将讨论将Array的{​​{1}}转换为String的{​​{1}}。

在快速Array中有一个名为Double的方法,它负责映射数组中的值,例如,在map函数中,您将收到一个引用到数组的对象,这将转换该对象到您的新阵列。

Array

结果将为return example

更新:

@LeoDabus评论了一个重要的提示,该示例正在考虑一个完美的数据源,但是如果您有一个动态源,则可以将map放回去,它将起作用,但是它将返回一个带有{{1 }}

喜欢

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

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

看一下,返回数组有一个?元素

Second example

如果您使用@LeoDabus的技巧,则可以保护这种情况,但您需要了解在问题中需要做什么,以便在nillet arrOfStrings = ["0.3", "0.4", "0.6", "a"]; let arrOfDoubles = arrOfStrings.map { (value) -> Double? in return Double(value) } 之间选择更好的选项

nil

的示例
map

查看结果

compactMap example result

更新:

与问题的作者(@davidandersson)讨论后,这种使用地图或contactMap的解决方案不是他的问题,我对他的代码进行了修改,效果很好。

首先我替换了compactMap Float compactMap Double`

查看最终代码

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

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

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

希望能为您提供帮助

答案 1 :(得分:0)

我认为您的代码不起作用的原因是,您有两个名称相同的变量,它们在不同的作用域中定义,并且最后使用了错误的变量。

您一开始就定义

var message = ""

然后转换为更小的数字

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

因此将最后一行更改为类似

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

并在计算中使用number。虽然我认为

var number = Double(message)

应该也可以正常工作,因为您已经为newContentArray[0]分配了message并且Double比Float更为常用(我不明白+ 10)