我正在尝试将字符串快速转换为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.
}
}
答案 0 :(得分:1)
我将讨论将Array
的{{1}}转换为String
的{{1}}。
在快速Array
中有一个名为Double
的方法,它负责映射数组中的值,例如,在map函数中,您将收到一个引用到数组的对象,这将转换该对象到您的新阵列。
Array
更新:
@LeoDabus评论了一个重要的提示,该示例正在考虑一个完美的数据源,但是如果您有一个动态源,则可以将map
放回去,它将起作用,但是它将返回一个带有{{1 }}
喜欢
let arrOfStrings = ["0.3", "0.4", "0.6"];
let arrOfDoubles = arrOfStrings.map { (value) -> Double in
return Double(value)!
}
看一下,返回数组有一个?
元素
如果您使用@LeoDabus的技巧,则可以保护这种情况,但您需要了解在问题中需要做什么,以便在nil
或let arrOfStrings = ["0.3", "0.4", "0.6", "a"];
let arrOfDoubles = arrOfStrings.map { (value) -> Double? in
return Double(value)
}
之间选择更好的选项
nil
map
查看结果
更新:
与问题的作者(@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)