我希望从tableview中收集MyArray的值作为
迅速:
True
如果添加一些值或删除一些结果更改
我希望我提出的问题正确,我希望得到正确的答案
答案 0 :(得分:2)
使用条件绑定遍历数组,如果该值无效(例如“ hello”),则不会输入条件。
var result = 0
for element in MyArray { // MyArray should have the first letter lowercased and have a more meaningful name.
if let number = Int(element) { // or NSNumber, Double, etc...
result = result + number
}
}
total.text = "\(result)" // consider naming it totalLabel
答案 1 :(得分:2)
使用myArray
将String
元素类型从Double
转换为compactMap
。然后使用reduce
方法添加元素。然后将结果转换为字符串以显示在标签中。
var myArray = ["2", "9", "33", "4", "wot?", "?"]
total.text = String(myArray.lazy.compactMap{ Double($0) }.reduce(0, +))//48.0
答案 2 :(得分:1)
两个建议:
使用reduce
汇总值并忽略非整数值
total.text = String(myArray.reduce(0, {$0 + (Int($1) ?? 0)}))
如果数组仅包含整数的字符串表示形式,则使用NSExpression
。 joined
将数组转换为"2+9+33+4"
let additionExpression = NSExpression(format: myArray.joined(separator: "+"))
total.text = "\(additionExpression.expressionValue(with: nil, context: nil)!)"
答案 3 :(得分:1)
有两个步骤:
计算总数。
考虑:
let array = ["200", "900", "33", "4"]
let total = array
.lazy
.compactMap { Double($0) }
.reduce(0, +)
请注意,与其他建议不同,我避免将其放在一行代码中(尽管可以)。函数式编程模式的目标是编写易于理解的富有表现力而又高效的代码。将所有这些放到一条线上与该目标即恕我直言是相反的,尽管可以说这是个人喜好问题。
设置标签文本。
设置标签文本时,很想只做String(total)
。但这不是一个非常用户友好的演示(例如,总和1,137将显示为“ 1137.0”)。也没有本地化。
在用户界面中显示结果(数字,日期,时间间隔等)时,典型的解决方案是使用“格式器”。对于数字值,通常会使用NumberFormatter
:
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
label.text = formatter.string(for: total)
对于美国用户,将显示“ 1,137”,而德国用户将显示“ 1.137”。因此,每台设备都能看到以与用户的本地化首选项一致的格式显示的数字。