我最近想编写一个平均值计算器。
我的计划是构建一个UITextField
,您可以在其中键入以逗号分隔的数字...按下“计算”按钮,应用程序应计算上面的数字平均值,并通过将labeltext设置为平均。
所以我写了我的平均函数并收到了这条错误信息:
无法将'UITextField'类型的值转换为预期的元素类型'Double'。
这是我的代码:
@IBOutlet var Input: UITextField!
@IBOutlet var Output: UILabel!
@IBAction func Calculate(sender: AnyObject) {
var grades:[Double] = [Input]
func average(nums: [Double]) -> Double {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
let average = total/gradesTotal
return average
}
let Average = average(grades)
Output.text = "Average: \(Average)"
}
你可以帮我解释一下这个想法吗?
有没有更好的方式来获得输入?
答案 0 :(得分:6)
你可以通过"双打"数组到你的平均函数
代码到copypaste:)
var str = "1,2,3,4,5,6"
let stringsWithNumbers = str.componentsSeparatedByString(",")
let doubles = stringsWithNumbers.map { Double($0)! }
答案 1 :(得分:2)
请使用较低的驼峰案例作为变量...
在这一行:
var grades:[Double] = [Input]
Input
是UITextField
的一个实例,因此您尝试将单个元素Array<UITextField>
分配给Array<Double>
。你看,你不能做这样的事情。
如果您想接受包含以逗号分隔的数字的文字,则需要明确将text
转换为[Double]
。
为简化起见,我们只需忽略nil
或非数字值。
然后,您需要将代码更改为:
@IBOutlet var input: UITextField!
@IBOutlet var output: UILabel!
@IBAction func calculate(sender: AnyObject) {
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)}
func average(nums: [Double]) -> Double {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
let average = total/gradesTotal
return average
}
let averageValue = average(grades)
output.text = "Average: \(averageValue)"
}
这一行的基本思路:
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)}
在Lu的回答中得到了很好的描述。我只是一个更安全的版本。
(加) 关于安全的一些解释:
UITextField
属性text
的类型为String?
,因此您应该认为它可以为零。使用??
运算符为nil提供默认值。
使用Double($0)!
可能会导致您的应用崩溃,因为对于非数字字符串,Double($0)
将返回nil。
写下这些让我想起了另一个崩溃案例。
当gradesTotal
== 0时,上面的代码会因为除零而崩溃。
(default
值对于上面的代码中的&#34; safety&#34;效果不佳...)
所以,再向安全迈进一步:
@IBAction func calculate(sender: AnyObject) {
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{
Double($0.stringByTrimmingCharactersInSet(.whitespaceCharacterSet()))
}
func average(nums: [Double]) -> Double? {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
if gradesTotal > 0 {
let average = total/gradesTotal
return average
} else {
return nil
}
}
if let averageValue = average(grades) {
output.text = "Average: \(averageValue)"
} else {
output.text = "Average not available"
}
}
答案 2 :(得分:0)
您需要做的是使用Double(Input.text)
代替[Input]
。现在,您试图将UITextField
转换为double,这会导致错误。
答案 3 :(得分:0)
let textInput = txtInputView.text;
let components = textInput.componentsSeparatedByString(",");
let sum = 0.0;
for txt in components
{
sum = sum + Double(txt);
}
let avg = sum / components.count;
print(avg)
答案 4 :(得分:0)
如果有人感兴趣,这是完整的代码:)
@IBOutlet var input: UITextField!
@IBOutlet var output: UILabel!
@IBAction func calculate(sender: AnyObject) {
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{
Double($0.stringByTrimmingCharactersInSet(.whitespaceCharacterSet()))
}
func average(nums: [Double]) -> Double? {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
if gradesTotal > 0 {
let average = total/gradesTotal
return average
} else {
return nil
}
}
if let averageValue = average(grades) {
output.text = "Average: \(averageValue)"
} else {
output.text = "Average not available"
}
}
@IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true)
}
当您点按计算...
时,我添加了行@IBAction func userTappedCalculate(sender: AnyObject) { view.endEditing(true)
}
以关闭输入的TextField