arrays - 快速将字符串数组转换为 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.
}
}
解决方案
我将讨论将Array
of转换String
为Array
of 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)
}
看结果
更新:
在与问题的作者(@davidandersson)交谈后,这个带有 map ou contactMap 的解决方案不是他的问题,我对他的代码进行了修改并且效果很好。
首先我替换了var message = "" per var rateValue:Double = 0.0 and replaced
Float to
Double`
看最终代码
让 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()
希望能帮到你
推荐阅读
- angular - 在 ionic3 中显示离子菜单,无需路由且无需手势
- flutter - 翻译后更改原文
- angular - 角度延迟加载是 2 个模块声明的一部分:AppModule 和 ProductModule
- react-native - cli : 无法与你的守望者交谈
- node.js - Node.js async/await 不等待执行 sql 存储过程的函数返回
- python - 将 pandas DataFrame 与具有预定义索引和列名的矩阵匹配
- laravel - 将 Laravel 控制器设置为 Linux 服务器后,无法从 Laravel 控制器中检索 GET 参数
- math - 无法根据想要的表达式工作的数学代码
- javascript - 具有相同状态/功能但 UI 不同的两个组件
- node.js - 节点应用程序路由和nginx位置如何匹配?